2013-05-07 11 views
44

In ihrem arXiv paper erwähnen die ursprünglichen Autoren von Julia folgenden:Parallelität in Julia. Merkmale und Einschränkungen

2.14 Parallelism. Die parallele Ausführung wird von einem in Julia in der Standardbibliothek implementierten nachrichtenbasierten Multiprozessorsystem bereitgestellt. Das Sprachdesign unterstützt die Implementierung solcher Bibliotheken durch mit symmetrischen Coroutinen, die auch als kooperativ geplante Threads gedacht werden können. Mit dieser Funktion kann die asynchrone Kommunikation in Bibliotheken versteckt werden, anstatt dass der Benutzer Rückrufe einrichten muss. Julia unterstützt derzeit nicht native Threads, was eine Einschränkung ist, hat aber den Vorteil, die Komplexität der synchronisierten Verwendung von Shared Memory zu vermeiden.

Was bedeuten sie sagen, dass Julia nicht native Threads unterstützt? Was ist ein nativer Thread?

Haben andere interpretierten Sprachen wie Python oder R unterstützen diese Art von Parallelität? Ist Julia allein dabei?

Antwort

60

"Native Threads" sind separate Ausführungskontexte, die vom Betriebssystemkernel verwaltet werden und auf einen gemeinsam genutzten Speicherbereich zugreifen und möglicherweise gleichzeitig auf separaten Kernen ausgeführt werden. Vergleichen Sie dies mit separaten Prozessen, die möglicherweise gleichzeitig auf mehreren Kernen ausgeführt werden, jedoch über separate Speicherbereiche verfügen. Sicherzustellen, dass Prozesse gut interagieren, ist einfach, da sie nur über den Kernel miteinander kommunizieren können. Sicherzustellen, dass Threads nicht in unvorhersehbarer, fehlerhafter Weise interagieren, ist sehr schwierig, da sie unbeschränkt in denselben Speicher lesen und schreiben können.

Die R-Situation ist ziemlich einfach: R is not multithreaded. Python ist etwas komplizierter: Python unterstützt Threading, aber aufgrund der global interpreter lock (GIL) ist keine gleichzeitige Ausführung von Python-Code möglich. Andere populäre dynamische Open-Source-Sprachen befinden sich in verschiedenen gemischten Zuständen in Bezug auf natives Threading (Ruby: no/kinda/yes?; Node.js: no), aber im Allgemeinen ist die Antwort nein, sie unterstützen nicht vollständig gleichzeitige native Threading, so Julia nicht allein darin.

Wenn wir Shared-Memory-Parallelität Julia hinzufügen, as we plan to - ob native Threads oder mehrere Prozesse mit gemeinsam genutztem Speicher verwenden - es wird wahr Nebenläufigkeit sein und es wird keine GIL verhindern gleichzeitige Ausführung von Julia-Code. Dies ist jedoch ein unglaublich kniffliges Merkmal, das zu einer Sprache hinzugefügt werden kann, was durch die nicht vorhandene oder begrenzte Unterstützung in anderen sehr populären, ausgereiften dynamischen Sprachen bestätigt wird. Das Hinzufügen eines Shared-Memory-Concurrency-Modells ist technisch schwierig, aber das eigentliche Problem ist das Entwerfen eines Programmiermodells, das es Programmierern ermöglicht, die Hardware-Nebenläufigkeit produktiv und sicher effektiv zu nutzen. Dieses Problem ist im Allgemeinen ungelöst und ein sehr aktiver Bereich der Forschung und des Experimentierens - es gibt keinen "Goldstandard" zu kopieren. Wir könnten nur Unterstützung für POSIX-Threads hinzufügen, aber dieses Programmiermodell wird allgemein als gefährlich und unglaublich schwierig richtig und effektiv zu verwenden angesehen. Go hat eine ausgezeichnete Nebenläufigkeit, aber es wurde entwickelt, um hochgradig gleichzeitige Server zu schreiben, nicht um gleichzeitig mit großen Daten zu arbeiten. Es ist also nicht klar, dass das Kopieren von Go's Modell eine gute Idee für Julia ist.

+4

Danke. Wenn Sie sagen, dass mit Python "keine tatsächliche gleichzeitige Ausführung von Python-Code möglich ist", meinen Sie innerhalb des gleichen Prozesses, richtig?Von dem, was ich verstehe, unterstützt Python ** bereits Shared-Memory-Parallelität mit Subprozessen über das Multiprocessing-Paket. Mit anderen Worten, als Sie sagten: "Wenn wir [...] hinzufügen, wird es echte Parallelität geben und es wird keine GIL geben, die die gleichzeitige Ausführung von Julia-Code verhindert.", Beziehen Sie sich auf das Szenario, in dem Julia dies mit * macht. * Native Threads **, andernfalls würde Julia Shared-Memory-Parallelität implementieren wie Python. Richtig? –

+4

Ja, wenn es sich um separate Prozesse handelt, dann reden wir nicht mehr von Threading. Es ist zu diesem Zeitpunkt unklar, ob die Art der shared-memory-Parallelität in Julia auf Threads oder Prozessen mit gemeinsam genutztem Speicher basiert, und diese Unterscheidung ist in jedem Fall eine Art Implementierungsdetail. Pythons Multiprocessing-Paket scheint eine Form von Multi-Prozess-Shared-Memory-Parallelität zu haben, aber es ist nicht so bequem oder natürlich, wie ich es für ein primitives Level auf Sprachebene hätte. – StefanKarpinski

+0

Ich sollte auch darauf hinweisen, dass experimentelle Arbeiten an Pythons Multiprocessing-Paket durchgeführt wurden: https://groups.google.com/forum/?fromgroups=#!searchin/julia-users/shmem$20mmap/julia-users/ Y_ME9uO5tVQ/HR0PPwTRIfIJ. – StefanKarpinski