Aktuelle parallele Modelle zur Berechnung

30

In den 1980er Jahren wurden sowohl das PRAM- als auch das BSP- Modell für parallele Berechnungen entwickelt. Es scheint, dass die Blütezeit beider Modelle in den späten 80ern und frühen 90ern lag.

Sind diese Bereiche noch in der Forschung nach parallelen Algorithmen aktiv? Gibt es neuere, ausgefeiltere Modelle für die parallele Berechnung? Sind allgemeine Modelle noch in Mode oder versuchen Forscher, sich auf GPGPU- oder Cloud-basierte Berechnungen zu spezialisieren?

Nicholas Mancuso
quelle

Antworten:

19

Es gibt eine Reihe von Modellen, aber einige der hervorstechendsten sind:

  1. Die MUD und mapreduce Modelle , die in erster Linie um die Erfassung der MapReduce Rahmen sind, aber ganz allgemein als parallel-verteilten Rechenmodelle betrachtet werden
  2. Die verschiedenen Multicore-Modelle , die vorgeschlagen wurden (aber noch keineswegs der Standard sind)

Letzten Monat gab es bei DIMACS einen Workshop zu diesem Thema: Wenn Sie die Abstracts lesen, erhalten Sie weitere Hinweise.

Suresh Venkat
quelle
Der DIMACs Workshop ist genial! Vielen Dank.
Nicholas Mancuso
3
2009 gab es einen früheren Workshop umiacs.umd.edu/conferences/tmc2009, der mir noch schärfer vorkam als der jüngste DIMACs-Workshop. Leslie Valiant stellte dort das Multi-BSP-Modell vor (das auf dem diesjährigen Workshop ausführlicher besprochen wurde), und Phil Gibbons von Intel präsentierte eine provokative Diskussionstheorie : Beim Umstieg auf einen Vielkern schlafen, die es sich anzusehen lohnt. Für mich war der DIMACs-Workshop viel zu sehr auf MapReduce ausgerichtet, das Google nicht mehr zum Erstellen seines Webindex verwendet.
András Salamon
das ist richtig. Ich hatte den früheren vergessen.
Suresh Venkat
22

Ich entschuldige mich im Voraus für das Blog-Post-Format meiner Antwort. Ich konnte nicht anders, als mir einen kleinen Überblick über die Parallel-Computing-Welt zu verschaffen.

Sie können parallele Programmiermodelle in ungefähr zwei Kategorien einteilen: Kontrollfluss- und Datenflussmodelle.

Die Kontrollflussmodelle versuchen, Parallelität im Kontext eines expliziten Kontrollprogramms zu ermöglichen, im Grunde genommen jeden heute programmierbaren Computer. Das grundlegende Problem besteht darin, dass eine solche "Von Neumann-Architektur" nicht für die parallele Ausführung, sondern für effiziente sequentielle Berechnungen konzipiert wurde. Parallelität in einem solchen Kontext wird durch Duplizieren von Teilen der Grundmodule (Speicher, Steuerung, Arithmetik) erhalten.

Wenn Sie nur Arithmetik duplizieren, erhalten Sie SIMD-Anweisungen. Alle ALUs verwenden denselben Programmzähler (PC) und führen daher immer den gleichen Vorgang parallel aus, wenn auch mit unterschiedlichen Daten.

Wenn Sie ALU und PC duplizieren, aber den Anweisungssequenzer in der Steuereinheit belassen, erhalten Sie eine Out-of-Order-Ausführung (OoO), die eine gewisse Pipeline-Parallelität ergibt. In dieser Kategorie finden Sie auch das VLWI (Very Long Instruction Word) und Techniken zur Branchenvorhersage. Sie sehen diese Kategorie jedoch selten auf Software-Ebene.

Ein bisschen weiter zu gehen bedeutet, den gesamten "Kern" zu duplizieren, aber den Speicher gemeinsam zu nutzen. Dies sind die aktuellen Multicore-Prozessoren, mit denen Sie Task- (oder Thread-) Parallelität erzielen. Wenn Sie in diesem Zusammenhang den Speicher gemeinsam nutzen, treten sehr , sehr schwierige und subtile Probleme bei der gemeinsamen Nutzung auf . Parallele Berechnungen auf aktuellen Multicores drehen sich daher vollständig um Synchronisations- / Parallelitätsprobleme, das sorgfältige Gleichgewicht zwischen Leistung (keine Synchronisation) und gewünschter Semantik (vollständig synchronisierte, sequentielle Ausführungssemantik). Beispiele hierfür sind der PRAM oder heutzutage populärer die Cilk ofshoots wie Fork / Join ( IntelTBB , Java.Utils.Concurrency)). CSP- und Actor-Modelle sind Parallelitätsmodelle, aber wie oben erwähnt verschwimmen Parallelität und Parallelität in einer Shared-Memory-Umgebung. nb Parallelität dient der Leistung und der Aufrechterhaltung der korrekten Semantik.

Durch das Duplizieren des Speichers erhalten Sie entweder vernetzte Computer, die mit MPI und seiner Art programmiert wurden, oder nur merkwürdige Nicht-Von-Neumann-Architekturen wie die Network-on-a-Chip-Prozessoren (Cloud-Prozessor, Transputer, Tilera). Speichermodelle wie UMA oder NUMA versuchen, die Illusion eines gemeinsam genutzten Speichers aufrechtzuerhalten und können entweder auf Software- oder Hardwareebene existieren. MPI behält die Parallelität auf Programmebene bei und kommuniziert nur über Message-Passing. Die Nachrichtenübermittlung wird auch auf Hardwareebene für die Kommunikation und den gemeinsamen Zugriff (Transputer) verwendet.

Die zweite Kategorie sind Datenflussmodelle . Diese wurden zu Beginn des Computerzeitalters entwickelt, um parallele Berechnungen aufzuschreiben und auszuführen, wobei das Von Neumann-Design vermieden wurde. Diese sind in den 80er Jahren aus der Mode gekommen (für Parallel Computing), nachdem die sequentielle Leistung exponentiell angestiegen ist. Viele parallele Programmiersysteme wie Google MapReduce, Microsoft Dryad oder Intel Concurrent Collections sind jedoch tatsächlich Datenfluss-Rechenmodelle. Irgendwann stellen sie Berechnungen als Grafik dar und verwenden diese, um die Ausführung zu steuern.

Durch die Angabe von Teilen des Modells erhalten Sie unterschiedliche Kategorien und Semantiken für das Datenflussmodell. Wie beschränken Sie die Form des Graphen auf: DAG (CnC, Dryad), Baum (Mapreduce), Digraph? Gibt es eine strikte Synchronisationssemantik ( Lustre, reaktive Programmierung]? Erlauben Sie Rekursion nicht, einen statischen Zeitplan (StreaMIT) zu haben, oder bieten Sie mehr Ausdruckskraft durch einen dynamischen Zeitplan (Intel CnC)? Gibt es eine Begrenzung für die Anzahl der eingehenden oder ausgehenden Flanken? Ermöglichen die Auslösungssemantiken das Auslösen des Knotens, wenn eine Teilmenge der eingehenden Daten verfügbar ist? Sind Kanten-Datenströme (Stream-Verarbeitung) oder einzelne Datentoken (statische / dynamische Einzelzuweisung). Für verwandte Arbeiten können Sie sich zunächst die Datenflussforschung von Personen wie Arvind, K. Kavi, j. Sharp, W. Ackerman, R. Jagannathan usw.

Edit: Der Vollständigkeit halber. Ich sollte darauf hinweisen, dass es auch parallele reduktionsgetriebene und mustergetriebene Modelle gibt. Für die Reduktionsstrategien haben Sie allgemein die Graph-Reduktion und die String-Reduktion. Haskell verwendet grundsätzlich die Graph-Reduktion, eine sehr effiziente Strategie für ein sequentielles Shared-Memory-System. Duplikate zur Zeichenfolgenreduzierung funktionieren, verfügen jedoch über eine Private-Memory-Eigenschaft, die eine implizite Parallelisierung erleichtert. Die mustergetriebenen Modelle sind die parallelen Logiksprachen, beispielsweise der gleichzeitige Prolog. Das Actor-Modell ist ebenfalls ein mustergetriebenes Modell, jedoch mit Merkmalen des privaten Speichers.

PS. Ich verwende den Begriff "Modell" allgemein und spreche sowohl für formale als auch für Programmierzwecke von abstrakten Maschinen.

Rindfleisch
quelle
Ich verstehe nicht, wie Mapreduce einen Baum bildet. Könntest du erklären?
Riko Jacob
@Riko Jacob, lassen Sie uns sagen, Sie ordnen (1 2 3 4) '+' zu, dies erzeugt konzeptionell einen Anwendungsbaum mit '+' an jedem Knoten und jeder Zahl als Blätter. Reduzieren (oder Falten, wenn Sie von haskel sind) reduziert jeden Knoten mit den Daten seiner untergeordneten Knoten.
Rindfleisch
K2,2
Wenn Sie die Erstellung des Diagramms selbst nicht berücksichtigen (z. B. die Zuordnung von a, b zu den Schlüssel / Tal-Paaren), werden zwei Bäume mit ein wenig gutem Willen reduziert :) Möglicherweise handelt es sich eher um ein k-verbundenes Diagramm oder ein Gitterdiagramm wie du gesagt hast. Sie haben Recht, dass es etwas allgemeiner ist als ein einfacher Baum. Ich habe versucht, eine Unterscheidung mit allgemeineren DAG-Datenflussstrukturen zu treffen.
Rindfleisch
8

Für Message-Passing-Architekturen ist CGM oder Coarse Grained Multicomputer mit Sicherheit ein Modell, das BSP ähnelt, aber einfacher zu handhaben ist und eine Leistungsanalyse bietet, die der tatsächlichen Leistung einer Maschine nahe kommt. Es wurde von Frank Dehne vorgeschlagen, und Sie werden viele interessante Artikel finden, in denen Algorithmen vorgestellt werden, die in diesem Zusammenhang entwickelt wurden.

CGM passt zu grobkörnigen Architekturen, wobei p Prozessoren vorausgesetzt werden, von denen jeder einen lokalen O (n / p) -Speicher und eine Eingangsgröße n aufweist, die viel größer ist (um Größenordnungen voneinander entfernt) als p, dh p≪n. Daher ist das Modell auf aktuellen Architekturen viel besser als andere. es wurde ausgiebig untersucht. Das Modell basiert auf den folgenden Annahmen: (i) Die Algorithmen führen sogenannte Supersteps aus, die aus einer Phase der lokalen Berechnung und einer Phase der Interprozessorkommunikation mit Zwischensperrensynchronisation bestehen. (Ii) Alle p Prozessoren haben Zugriff auf O (n / p) lokaler Speicher, (iii) in jedem Superstep kann ein Prozessor höchstens O (n / p) Elemente senden und empfangen, und (iv) das Kommunikationsnetz zwischen den Prozessoren kann beliebig sein. In diesem Modell wird ein Algorithmus hinsichtlich seiner Berechnungszeit und der Anzahl der Kommunikationsrunden bewertet. Das Modell ist zwar einfach, bietet jedoch eine vernünftige Vorhersage der tatsächlichen Leistung paralleler Algorithmen. In der Tat weisen parallele Algorithmen für CGMs normalerweise eine theoretische Komplexitätsanalyse auf, die den tatsächlichen Zeiten sehr nahe kommt, die experimentell beim Implementieren und Benchmarking ermittelt wurden.

Massimo Cafaro
quelle
4

Paralleler externer Speicher (PEM) ist eine natürliche Kombination einer PRAM-artigen Shared-Memory-Maschine mit dem externen Speichermodell. Es konzentriert sich auf die Auswirkungen privater Caches.

Riko Jacob
quelle
4

Soweit ich weiß, werden die BSP- und LogP-Modelle heute für verteilte Algorithmen verwendet. Auch seit GPU-Computing wird der PRAM wieder populär, allerdings sollte man die Speicherhierarchien in die Analyse einbeziehen. Sie können das UPMH-Modell (Uniform Parallel Memory Hierarchie) überprüfen, das gut zu PRAM passt.

B. Alpern, L. Carter, E. Feig und T. Selker. Das einheitliche Speicherhierarchiemodell der Berechnung. Algorithmica, 12: 72–109, 1994. 10.1007 / BF01185206.

Bowen Alpern, Larry Carter und Jeanne Ferrante. Modellierung paralleler Computer als Speicherhierarchien. In In Proc. Programmiermodelle für massiv parallele Computer, S. 116–123. IEEE Computer Society Press, 1993.

Auch für das GPU-Computing wurde ein theoretisches Rechenmodell vorgeschlagen. das K-Modell:

Gabriele Capannini, Fabrizio Silvestri und Ranieri Baraglia. K-Modell: Ein neues Rechenmodell für Stream-Prozessoren. In Proceedings of the 2010 IEEE 12. International Conference on High Performance Computing and Communications, HPCC '10, S. 239–246, Washington, DC, USA, 2010. IEEE Computer Society.

Zuletzt habe ich Cellular Automata (CA) gesehen, die als Parallelrechner modelliert wurden. Ich persönlich halte dies für ein sehr interessantes Forschungsthema. Wer in Zukunft weiß, dass Prozessoren wie kleine Rechenräume auf diese Weise erstellt werden. Ich habe keine solide Referenz dafür, du kannst im Web nachschauen.

labotsirc
quelle
3

Rein funktionale Programme ermöglichen die parallele Ausführung von unabhängigen Ausdrücken. Daher würde ich sie als parallele Rechenmodelle betrachten.

Riko Jacob
quelle
Es gibt kein spezielles Kostenmodell für die funktionale Programmierung, daher ist die Frage hiermit nicht beantwortet. Siehe cstheory.stackexchange.com/questions/376/…
Charles Stewart,
2
Der Bewertungsmechanismus für solche Lambda-Kalkül-basierten Sprachen ist die Reduktion, die keine direkte Abbildung auf die tatsächliche Hardware hat. Aus diesem Grund muss Haskell noch explizite Parallelkonstrukte wie 'par' einführen. Referenz: csg.csail.mit.edu/projects/languages/ph.shtml
Rindfleisch
3

Ich bevorzuge den Bader-Jaja-Ansatz (siehe Abschnitt 2.1). Sie modellieren Komplexität als Problem der Nachrichtenübermittlung. Für jede gesendete Nachricht gibt es sowohl eine Variable für die Latenz zum Einleiten der Kommunikation als auch eine Variable für die Bandbreite.

tumptump

Chad Brewbaker
quelle
-3

Sie erwähnen Cloud Computing speziell. Innerhalb weniger Jahre gab es in diesem Bereich intensive Innovationen mit der Amazon Elastic Compute Cloud, der Google App Engine und verschiedenen Tools und den zugehörigen konzeptionellen Parallelverarbeitungsmodellen.

Zu den speziellen Open-Source-Tools gehören die Datenbanken Mapreduce , Apache Hadoop und NoSQL von Google , die sich als neue, starke und weithin angepasste Standards für die "Best Practices" und "Design Patterns" des Parallelisierungsalgorithmus herausstellen . Auch memcacheD wird zunehmend als speicherinterne verteilte Datenbank eingesetzt. Ein Beispiel dafür wird bei Facebook verwendet und in einem kürzlich erschienenen Artikel beschrieben [1].

[1] Viele Schlüsselwertspeicher von Berezecki et al

vzn
quelle
nochmal. Ich bitte um Modelle oder Parallelberechnung. Keine Werkzeuge. MapReduce ist ein solches Modell. Hadoop und NoSQL jedoch nicht. Hadoop ist eine Java-basierte Version von MapReduce. NoSQL ist ein Modell für entspannte Schlüsselspeicher, soweit ich das beurteilen kann.
Nicholas Mancuso
MapReduce begann als Tool und entwickelte sich durch weit verbreitete Nutzung / Übernahme zu einem Modell. das Gleiche gilt für die anderen. Hadoop ist nicht identisch mit MapReduce, aber vielleicht ähnlich. Ja, ich schätze, ich wurde von Sureshs Top-Voting-Antwort, die MapReduce enthielt, verblüfft. Die Leute scheinen sich nicht viel um aktuelle Software-Pakete auf dieser Site zu kümmern oder diese nicht zu diskutieren, egal wie weit verbreitet sie sind. Selbst wenn man bedenkt, dass sie eine solide spätere Theorie inspirieren / überkreuzen / vorantreiben , wie MapReduce es tat ... my bad = (
vzn
2
Punkt ist, Sie beantworten die Frage nicht. Die Politik hier ist, dass Vorschläge, die sich tangential auf die Frage beziehen, keine akzeptablen Antworten sind. Wenn Ihnen diese Richtlinie nicht gefällt, können Sie sich dafür entscheiden, nicht teilzunehmen. Wenn Sie konkrete Vorstellungen über die Modellierung eines realen Parallelsystems hätten, wäre dies eher thematisch (obwohl die gestellte Frage immer noch nicht beantwortet wird)
Sasho Nikolov
-3

ein anderer Winkel dazu. Zwar könnte dies von einigen als etwas undeutlich oder als Randerscheinung angesehen werden, aber es gibt einige Arbeiten zur allgemeinen Parallelisierung probabilistischer Algorithmen, von denen behauptet wird, dass sie für die Parallelität auf natürliche Weise geeignet sind.

siehe zB Parallele probabilistische Berechnungen auf einem Cluster von Workstations Radenski, Vann, Norris:

Probabilistische Algorithmen sind rechenintensive Näherungsmethoden zur Lösung schwer zu lösender Probleme. Probabilistische Algorithmen sind ausgezeichnete Kandidaten für Clusterberechnungen, da sie wenig Kommunikation und Synchronisation erfordern. Es ist möglich, eine gemeinsame parallele Kontrollstruktur als generischen Algorithmus für probabilistische Clusterberechnungen anzugeben . Ein derartiger generischer paralleler Algorithmus kann mit domänenspezifischen sequentiellen Algorithmen zusammengefügt werden, um ungefähre parallele Lösungen für verschiedene hartnäckige Probleme abzuleiten. In diesem Artikel schlagen wir einen generischen Algorithmus für probabilistische Berechnungen auf einem Cluster von Workstations vor. Wir verwenden diesen generischen Algorithmus, um spezifische parallele Algorithmen für zwei diskrete Optimierungsprobleme abzuleiten: das Rucksackproblem und das Verkaufsproblem auf Reisen.

falls es nicht klar ist, ist die "gemeinsame parallele Kontrollstruktur als generischer Algorithmus", auf die zusammen mit der probabilistischen Berechnung und der Gesamtumwandlung Bezug genommen wird, das "Modell".

Es könnte argumentiert werden, dass probabilistische Berechnungen nicht ausschließlich klassisches Rechnen oder Turing vollständig sind. man beachte also, dass es einige Arbeiten gibt, um klassische mit probabilistischen Berechnungen zu verknüpfen, auch speziell in einem parallelen Kontext, z

Begründung zu probabilistischen Parallelprogrammen von Rao:

Die Verwendung der Randomisierung beim Entwurf und bei der Analyse von Algorithmen verspricht einfache und effiziente Algorithmen für schwierige Probleme, von denen einige möglicherweise keine deterministische Lösung haben. Dieser Gewinn an Einfachheit, Effizienz und Lösbarkeit führt zu einem Kompromiss zwischen dem traditionellen Begriff der absoluten Korrektheit von Algorithmen und einem quantitativeren Begriff: der Korrektheit mit einer Wahrscheinlichkeit zwischen 0 und 1. Die Hinzufügung des Parallelitätsbegriffs zum ohnehin nicht intuitiven Begriff Die Idee der Randomisierung erschwert das Denken über probabilistische Parallelprogramme umso mehr. In diesem Artikel beschäftigen wir uns mit dem Problem, Eigenschaften probabilistischer Parallelprogramme zu spezifizieren und abzuleiten, die entweder deterministisch oder mit Wahrscheinlichkeit 1 gelten.

Natürlich ist QM-Computing dem probabilistischen Computing sehr ähnlich (eine nette Referenz, die dies hervorhebt, ist One Complexity Theorist's View of Quantum Computing von Fortnow ) und es gibt Hinweise, dass diese Ansätze dort erweitert werden könnten, z. B. in der Arbeit in der parallelen QM-Simulation.

vzn
quelle
-6

Dies wird von einigen als kontrovers angesehen, und selbst Befürworter dieses Blickwinkels werden zugeben müssen, dass es sich in den frühen Stadien der Forschung befindet, aber im Grunde genommen scheint Quantencomputing viele Verbindungen zu Parallelität und paralleler Berechnung zu haben. Die Referenzen sind derzeit verstreut, aber ein aufstrebendes Thema kann von einem entschlossenen Forscher gesehen werden.

Vielleicht ist die beste Verbindung mit Grovers-Suchalgorithmus, von dem kürzlich gezeigt wurde, dass er allgemeiner ist, da er für die Beschleunigung der meisten NP-Gesamtprobleme im Allgemeinen verwendet werden kann [5]. Der Algorithmus von Grovers scheint eine starke Analogie / Verbindung zu den Suchalgorithmen für parallele Datenbanken zu haben. Die besten klassischen seriellen Algorithmen können nicht dieselbe Leistung erbringen, aber mindestens eine Behörde argumentiert kürzlich, dass QM-Ansätze für die Suche parallelisierte klassische Algorithmen nicht übertreffen. [1]

Weitere Belege sind Schemata, die explizit die Parallelität bei der Quantensuche untersuchen, z. B. [2]. Es wurden auch Quantensimulatoren vorgeschlagen, die auf paralleler / verteilter Verarbeitung basieren [3] [4]. Da das Schema gut passt und zu effizienten und nachvollziehbaren Simulationen führt (30 Qubits werden in Lit. [3] simuliert), wird diese Konvertierung durchgeführt Dies ist sicherlich kein Zufall und deutet auf eine tiefere Brücke zwischen parallelem klassischem Computing und QM-Computing hin, die aber wahrscheinlich bisher aufgedeckt wurde.

[1] Ist die Quantensuche praktisch? von Viamontes et al

[2] Genaue Quantensuche nach parallelen einheitlichen Diskriminierungsschemata von Wu / Dian

[3] Allzweck-Parallel-Simulator für das Quantencomputing von Niwa, Matsumoto, Imai.

[4] Effizientes verteiltes Quantencomputing von Beals et al. 2012

[5] Lösen von NP-Gesamtproblemen mit der Quantensuche von Furer 2008

vzn
quelle
@vnz, das scheint bestenfalls ein zufälliges Durcheinander von Konzepten Quantum zu sein. Das "parallele Quantum" googeln und die Ergebnisse hier aufzulisten, nützt mir und anderen, die dies lesen, nichts. Ich denke, es wäre besser für die Community, auf Antworten zu reagieren, mit denen Sie sich wohl fühlen und über die Sie Bescheid wissen, als nur einen Wahnsinnsschlag für Reputationspunkte zu machen. Es ist nicht konstruktiv und möglicherweise unaufrichtig, sich die Quantenberechnung als parallele Suche vorzustellen. Die Quantenberechnung hat, um Ihre Beschreibung zu verwenden, "starke Analogien / Verbindungen" mit probabilistischer Suche, nicht parallel.
Nicholas Mancuso,
Ich weiß nicht, welches Dogma in Klassenzimmern gelehrt wird, aber wenn jemand da draußen tatsächlich eine VERWEISUNG hat, anstatt bloße GRUNDLOSE Behauptungen, die anzeigen, warum es keine Gültigkeit für eine bisher aufgedeckte Entsprechung von QM gibt, die eine parallele klassische Berechnung durchführt, werde ich LESEN ES. QM-Computing liefert präzise Antworten, z. B. unter Berücksichtigung von Shor-Factoring. Andernfalls handelt es sich nicht um ein tatsächliches Rechensystem. Es gibt auch andere Möglichkeiten als die skizzierte, um zu demonstrieren, dass QM-Computing in gewissem Sinne dem parallelen klassischen Computing entsprechen muss. Vielleicht Da es nicht in einem Lehrbuch steht, muss es falsch sein, huh !!
vzn
Es gibt hier einen vollständigen kostenlosen Kurs zum Thema Quantencomputing: coursera.org , der möglicherweise die Dinge für Sie klärt.
Nicholas Mancuso
ps wie für "hodgepodge" ... versuchen Sie tatsächlich das Lesen der REFS .. oder vielleicht nur in Ihrem Fall
überfliegen wink
1
(6.) Deine Ref. [5] beschreibt Möglichkeiten, wie der Algorithmus von Grover erweitert werden kann, ohne die Parallelität zu berücksichtigen, nach der Sie bei der Quantenberechnung suchen. Fazit: Ihre Interpretation, dass es Zusammenhänge zwischen Quanten- und Parallelberechnung gibt, scheint aus der Many Worlds Interpretation of QM zu stammen. Obwohl es nicht dunkel ist, ist es auch nicht unumstritten und erlaubt uns sicherlich nicht, die Quantenberechnung produktiv als "parallele Berechnung" zu beschreiben, außer in dem Maße, in dem wir diese Berechnungen nicht sehen ... was kein starkes Argument dafür ist Ihre Anwesenheit.
Niel de Beaudrap