Cilk
Paradigma | Imperativ (prozedural), strukturiert, parallel |
---|---|
Entworfen von | MIT Labor für Informatik |
Entwickler | Intel |
Erstmals erschienen | 1994 |
Disziplin tippen | statisch, schwach, Manifest |
Webseite | Cilk |
Dialekte | |
Cilk ++, Cilk Plus, OpenCilk | |
Beeinflusst von | |
C | |
Beeinflusst | |
OpenMP 3.0[1] |
Entworfen von | MIT |
---|---|
Entwickler | MIT |
Erstmals erschienen | 2020 |
Stabile Version | 1.1 / 22. Oktober 2021 |
Lizenz | MIT |
Webseite | Cilk |
Entworfen von | Intel |
---|---|
Entwickler | Intel |
Erstmals erschienen | 2010 |
Stabile Version | 1.2 / 9. September 2013 |
Dateiname -Erweiterungen | (Gleich wie C oder C ++) |
Webseite | http://cilkplus.org/ |
Cilk, Cilk ++, Cilk Plus und OpenCilk sind allgemeiner Zweck Programmiersprachen designed für Multithread Parallele Computing. Sie basieren auf dem C und C ++ Programmiersprachen, die sie mit Konstrukten erweitern, um parallele Schleifen und die auszudrücken Fork -Join -Idiom.
Ursprünglich in den neunziger Jahren entwickelt in der Massachusetts Institute of Technology (MIT) in der Gruppe von Charles E. Leiserson, Cilk wurde später von einem Spin -off -Unternehmen, Cilk Arts, als Cilk ++ kommerzialisiert. Dieses Unternehmen wurde anschließend von erworben von Intel, die die Kompatibilität mit dem vorhandenen C- und C ++ - Code erhöhte und das Ergebnis Cilk Plus aufrief. Nachdem Intel im Jahr 2017 aufgehört hat, Cilk Plus zu unterstützen, entwickelt MIT erneut Cilk in Form von OpenCilk.
Geschichte
MIT Cilk
Die Cilk -Programmiersprache entstand aus drei getrennten Projekten im MIT -Labor für Informatik:[2]
- Theoretische Arbeiten zur Planung von Anwendungen mit Multi-Thread-Anwendungen.
- Startech - eine Parallele Schachprogramm Erstellt, um auf dem Verbindungsmaschinenmodell des Thinking Machines Corporation zu laufen, CM-5.
- PCM/Threaded-C-Ein C-basiertes Paket zum Planen von Threads im CM-5
Im April 1994 wurden die drei Projekte kombiniert und "Cilk" getauft. Der Name Cilk ist kein Akronym, sondern eine Anspielung auf "schöne Threads" (Seide) und die C -Programmiersprache. Der Cilk-1-Compiler wurde im September 1994 veröffentlicht.
Die ursprüngliche Cilksprache basierte auf Ansi cmit der Zugabe von cilkspezifischen Schlüsselwörtern zur Parallelität. Wenn die CILK -Schlüsselwörter aus dem Cilk -Quellcode entfernt werden, sollte das Ergebnis immer ein gültiges C -Programm sein, das als die genannt wird Serienelision (oder C Elision) des vollständigen Cilk -Programms mit der gleichen Semantik wie das Cilk -Programm, das auf einem einzigen Prozessor ausgeführt wird. Trotz mehrerer Ähnlichkeiten,[die?] Cilk ist nicht direkt mit der gleichzeitigen C -Labors von AT & T Bell Labs verbunden. C.
Cilk wurde als Übersetzer von C implementiert, was auf die abzielte GNU C Compiler (GCC). Die letzte Version, Cilk 5.4.6, ist im MIT Informatik and Artificial Intelligence Laboratory (CSAIL) erhältlich, wird jedoch nicht mehr unterstützt.[3]
Ein Schaufenster für Cilks Fähigkeiten war das Cilkchess Parallele Chess-Playing-Programm, das in den 1990er Jahren mehrere Computer-Schachpreise gewann, darunter die Open Dutch Computer Chess Championship von 1996.[4]
Cilk Arts und Cilk ++
Vor c.2006Der Markt für Cilk war auf Hochleistungs-Computing beschränkt. Die Entstehung von Multicore -Prozessoren im Mainstream -Computer führte dazu, dass jedes Jahr Hunderte Millionen neuer paralleler Computer versendet wurden. Cilk Arts wurde gegründet, um diese Gelegenheit zu nutzen: 2006 startete Leisson Cilk Arts, um eine moderne Version von Cilk zu schaffen und zu vermarkten, die die kommerziellen Bedürfnisse einer bevorstehenden Generation von Programmierern unterstützt. Das Unternehmen schloss im Oktober 2007 eine Venture -Finanzierungs -Runde der Serie A, und sein Produkt Cilk ++ 1.0 wurde im Dezember 2008 verschickt.
Cilk ++ unterscheidet sich in mehrfacher Hinsicht von Cilk: Unterstützung für C ++, Unterstützung für Schleifen und Hyperobjekte- Ein neues Konstrukt zur Lösung von Datenrennenproblemen durch parallelen Zugriffe zu globalen Variablen. Cilk ++ war proprietäre Software. Wie sein Vorgänger wurde es als Cilk-to-C ++-Compiler implementiert. Es unterstützte die Microsoft und GNU -Compiler.
Intel Cilk Plus
Am 31. Juli 2009 kündigte Cilk Arts auf seiner Website an, dass sein Produkt- und Ingenieurteam jetzt Teil Intel Corp. Anfang 2010, die Cilk -Website unter www.cilk.com
begann mit der Umleitung auf die Intel -Website (Anfang 2017 wird die ursprüngliche Cilk -Website nicht mehr auf einen Host beschrieben). Intel und Cilk Arts integriert und fortschritt die Technologie weiter, was zu einer Veröffentlichung von Intel im September 2010 führt Cilk Plus.[5][6] CILK Plus nimmt Vereinfachungen an, die von Cilk Arts in CILK ++ vorgeschlagen werden, um die Notwendigkeit einiger der ursprünglichen Cilk -Schlüsselwörter zu beseitigen und gleichzeitig die Fähigkeit hinzuzufügen, Funktionen hervorzubringen und mit Variablen umzugehen, die an Reduktionsoperationen beteiligt sind. Cilk Plus unterscheidet sich von Cilk und Cilk ++ durch Hinzufügen von Array -Erweiterungen, die in einen kommerziellen Compiler (von Intel) und die Kompatibilität mit vorhandenen Debuggern aufgenommen werden.[7]
Cilk Plus wurde erstmals in der implementiert Intel C ++ - Compiler Mit der Veröffentlichung des Intel Compiler im Intel -Komponisten XE 2010. Eine Open Source (BSD-lizenziert) Die Implementierung wurde von Intel zur GNU Compiler -Sammlung (GCC), der Cilk Plus Support in Version 4.9 versandte.[8] mit Ausnahme der _Cilk_for Schlüsselwort, das in GCC 5.0 hinzugefügt wurde. Im Februar 2013 kündigte Intel a Klang Gabel Mit Cilk Plus -Unterstützung.[9] Der Intel -Compiler, aber nicht die Open -Source -Implementierungen, wird mit a geliefert Renndetektor und ein Leistungsanalysator.
Intel wurde später eingestellt und empfiehlt, dass der Benutzer stattdessen von beiden verwendet wird OpenMP oder Intels eigene TBB -Bibliothek für ihre parallelen Programmierbedürfnisse.[10]
Unterschiede zwischen Versionen
In der ursprünglichen MIT -Cilk -Implementierung ist das erste Cilk -Schlüsselwort tatsächlich Cilk
, was eine Funktion identifiziert, die in Cilk geschrieben ist. Da CILK -Verfahren C -Verfahren direkt aufrufen können, C -Prozeduren können jedoch nicht direkt aufrufen oder laichen CILK -Verfahren, dieses Schlüsselwort ist erforderlich, um den Cilk -Code vom C -Code zu unterscheiden. Cilk Plus entfernt diese Einschränkung sowie die Cilk
Schlüsselwort, also können C- und C ++ -Funktionen in Cilk Plus Code aufrufen und umgekehrt.
Abwertung von Cilk Plus
Im Mai 2017 wurde GCC 7.1 veröffentlicht und kennzeichnete Cilk Plus -Unterstützung als veraltet.[11] Intel selbst gab im September 2017 bekannt, dass sie Cilk Plus mit der Veröffentlichung der Intel Software Development Tools 2018 abbauen würden.[10] Im Mai 2018 wurde GCC 8.1 mit Cilk Plus -Unterstützung veröffentlicht.[12]
OpenCilk
Nachdem Cilk Plus die Unterstützung durch Intel veraltet wurde, hat MIT die Entwicklung von Cilk in der OpenCilk -Implementierung übernommen.[10][13] OpenCilk ist nach wie vor weitgehend kompatibel mit Intel Cilk Plus.[14] Die erste stabile Version wurde im März 2021 veröffentlicht.[15]
Sprachmerkmale
Das Prinzip hinter dem Design der Cilk -Sprache ist, dass der Programmierer verantwortlich sein sollte exponieren die Parallelität, die Elemente identifiziert, die sicher parallel ausgeführt werden können; Es sollte dann der Laufzeitumgebung überlassen werden, insbesondere der Planer, um während der Ausführung zu entscheiden, wie die Arbeit zwischen Prozessoren tatsächlich teilt. Dies liegt daran, dass diese Verantwortlichkeiten getrennt sind, dass ein Cilk -Programm ohne Umschreiben auf eine beliebige Anzahl von Prozessoren, einschließlich eines, ausgeführt werden kann.
Aufgabenparallelität: Spawn und Synchronisation
Cilks Hauptanzug zu C sind zwei Schlüsselwörter, die zusammen das Schreiben von Task-Parallel-Programmen ermöglichen.
- Das laichen Schlüsselwort, wenn Sie einem Funktionsaufruf vorgehen ( Spawn f (x)), gibt an, dass der Funktionsaufruf ( f (x)) kann sicher parallel zu den Anweisungen in der Aufruffunktion ausgeführt werden. Beachten Sie, dass der Scheduler nicht ist verpflichtet dieses Verfahren parallel ausführen; Das Schlüsselwort benachrichtigt lediglich den Scheduler, dass dies dies kann.
- A Synchronisation Die Anweisung zeigt an, dass die Ausführung der aktuellen Funktion erst dann fortgesetzt wird, wenn alle zuvor ausgeführten Funktionsaufrufe abgeschlossen sind. Dies ist ein Beispiel für a Barriere Methode.
(In Cilk Plus werden die Schlüsselwörter geschrieben _Cilk_spawn und _Cilk_sync, oder cilk_spawn und cilk_sync Wenn die Cilk Plus -Header enthalten sind.)
Unten ist a rekursiv Implementierung der Fibonacci Funktion in Cilk mit parallel rekursiven Aufrufen, die das demonstriert laichen, und Synchronisation Schlüsselwörter. Das ursprüngliche Cilk erforderte jede Funktion, die diese verwendeten, um mit dem kommentiert zu werden Cilk Schlüsselwort, das ab Cilk Plus verschwunden ist. (Cilk -Programmcode ist nicht nummeriert; die Zahlen wurden nur hinzugefügt, um die Diskussion zu erleichtern.)
Cilk int Flunkerei(int n) { wenn (n < 2) { Rückkehr n; } anders { int x, y; x = laichen Flunkerei(n - 1); y = laichen Flunkerei(n - 2); Synchronisation; Rückkehr x + y; } }
Wenn dieser Code von a ausgeführt wurde Single Prozessor, um den Wert von zu bestimmen Fib (2), dieser Prozessor würde a erstellen rahmen zum Fib (2)und führen Zeilen 1 bis 5 aus x und y. In Zeile 8 müsste der Prozessor den aktuellen Frame aussetzen und einen neuen Frame erstellen, um die Prozedur auszuführen Fib (1)führen Sie den Code dieses Frame bis zum Erreichen einer Rückgabeanweisung aus und nehmen Sie dann die wieder auf Fib (2) Rahmen mit dem Wert von Fib (1) in platziert in Fib (2)'s x Variable. In der nächsten Zeile müsste es erneut suspendieren, um auszuführen Fib (0) und das Ergebnis platzieren Fib (2)'s y Variable.
Wenn der Code auf a ausgeführt wird Multiprozessor Die Maschine geht jedoch anders fort. Ein Prozessor startet die Ausführung von Fib (2); Wenn es jedoch Zeile 8 erreicht, die laichen Schlüsselwort, der den Anruf an den Aufruf ändert FIB (N-1) teilt dem Prozessor mit, dass er den Job einem zweiten Prozessor sicher geben kann: Dieser zweite Prozessor kann einen Rahmen für Fib (1)speichern Sie seinen Code und speichern Sie sein Ergebnis Fib (2)Rahmen, wenn es fertig ist; Der erste Prozessor führt den Code von fort Fib (2) zur selben Zeit. Ein Prozessor ist nicht verpflichtet, ein hervorgebrachtes Verfahren an anderer Stelle zuzuweisen. Wenn die Maschine nur zwei Prozessoren hat und die zweite noch beschäftigt ist Fib (1) Wenn der Prozessor ausführt Fib (2) Erhöht sich zum Verfahrensanruf, der erste Prozessor wird suspendieren Fib (2) und ausführen Fib (0) selbst, wie es wäre, wenn es der einzige Prozessor wäre. Wenn ein anderer Prozessor verfügbar ist, wird dies natürlich in den Dienst gerufen, und alle drei Prozessoren würden gleichzeitig separate Frames ausführen.
(Die vorhergehende Beschreibung ist nicht ganz genau. Obwohl die gemeinsame Terminologie für die Erörterung von Cilk sich darauf bezieht, dass Prozessoren die Entscheidung treffen, die Arbeit an andere Prozessoren zu erstellen, ist es tatsächlich der Scheduler, der den Verfahren für die Ausführung den Verfahren für die Ausführung zuweist, unter Verwendung einer Richtlinie namens Arbeitsdauer, später beschrieben.)
Wenn der Prozessor ausführt Fib (2) Es wurde die Ausführung von Zeile 13 vor dem Ausschluss ihrer Rahmen ausführen, sondern ein falsches Ergebnis oder einen Fehler erzeugen. Fib (2) würde versuchen, die in gespeicherten Werte hinzuzufügen x und y, aber einer oder beide dieser Werte würden fehlen. Dies ist der Zweck der Synchronisation Schlüsselwort, das wir in Zeile 11 sehen: Es gibt dem Prozessor mit, dass er seine eigene Ausführung ausführen muss, bis alle Verfahrensaufrufe zurückgegeben wurden. Wann Fib (2) darf an der vorbeigehen Synchronisation Aussage in Zeile 11 kann es nur deshalb liegen Fib (1) und Fib (0) haben ihre Ergebnisse abgeschlossen und platziert x und yEs ist sicher, Berechnungen für diese Ergebnisse durchzuführen.
Das obige Codebeispiel verwendet die Syntax von CILK-5. Das ursprüngliche Cilk (CILK-1) verwendete eine ziemlich andere Syntax, die in einem expliziten Programmieren erforderlich war Fortsetzungsstilund die Fibonacci -Beispiele sehen wie folgt aus:[16]
Faden Flunkerei(Fortsetzung int k, int n) { wenn (n < 2) { send_argument(k, n); } anders { Fortsetzung int x, y; Spawn_Next Summe(k, ?x, ?y); laichen Flunkerei(x, n - 1); laichen Flunkerei(y, n - 2); } } Faden Summe(Fortsetzung int k, int x, int y) { send_argument(k, x + y); }
Innen FlunkereiDer rekursive Fall, der, der Spawn_Next Das Schlüsselwort zeigt die Erstellung von a an Nachfolger Thread (im Gegensatz zu dem Kind Themen erstellt von laichen), was die ausführt Summe Unterroutine, nachdem er auf die gewartet hatte Fortsetzungsvariablen x und y durch die rekursiven Anrufe ausgefüllt werden. Der Basisfall und Summe verwenden ein send_argument (k, n) Betrieb, um ihre Fortsetzungsvariable festzulegen k zum Wert von neffektiv "zurückgeben" den Wert an den Nachfolger -Thread.
Einlässe
Die beiden verbleibenden Cilk -Schlüsselwörter sind etwas fortgeschrittener und betreffen die Verwendung von Einlässe. Normalerweise kann ein Cilk -Verfahren seine Ergebnisse nur an das übergeordnete Verfahren zurückgeben, indem diese Ergebnisse in eine Variable im Rahmen des Elternteils eingesetzt werden x
und y
.
Die Alternative besteht darin, einen Einlass zu verwenden. Ein Einlass ist eine Funktion für eine CILK -Prozedur, die die Ergebnisse eines Aufrufs eines hervorgebrachten Prozesses bei der Rückkehr behandelt. Ein Hauptgrund für die Verwendung von Einlässen ist, dass alle Einlässe eines Verfahrens garantiert arbeiten werden atomisch In Bezug auf einander und die übergeordnete Prozedur, wodurch die Fehler vermieden werden, die auftreten könnten, wenn die Mehrfachrückgabeverfahren versuchten, gleichzeitig dieselben Variablen im übergeordneten Frame zu aktualisieren.
- Das
Einlass
Das Schlüsselwort identifiziert eine in der Prozedur als Einlass definierte Funktion. - Das
abbrechen
Schlüsselwort kann nur in einem Einlass verwendet werden. Es teilt dem Scheduler mit, dass alle anderen Verfahren, die durch das übergeordnete Verfahren ausgelöst wurden, sicher abgebrochen werden können.
Die Einlässe wurden entfernt, als Cilk Cilk ++ wurde, und sind nicht in Cilk Plus vorhanden.
Parallele Loops
Cilk ++ fügte ein zusätzliches Konstrukt hinzu, die parallele Schleife, bezeichnet cilk_for in Cilk Plus. Diese Schleifen sehen aus wie
Leere Schleife(int *a, int n) { #PRAGMA CILK GRAINSIZE = 100 // Optional cilk_for (int i = 0; i < n; i++) { a[i] = f(a[i]); } }
Dies implementiert die Parallele Karte Idiom: Der Körper der Schleife, hier ein Anruf zu f gefolgt von einer Aufgabe zum Array a, wird für jeden Wert von ausgeführt i von null bis n in einer unbestimmten Reihenfolge. Die optionale "Korngröße" Pragma Bestimmt das Verhandeln: Jegliches Unterarray von einhundert oder weniger Elementen wird nacheinander verarbeitet. Obwohl die CILK-Spezifikation nicht das genaue Verhalten des Konstrukts angibt, ist die typische Implementierung eine Dividen- und Konquer-Rekursion.[17] Als ob der Programmierer geschrieben hätte
statisch Leere Rekursion(int *a, int Anfang, int Ende) { wenn (Ende - Anfang <= 100) { // Die 100 hier ist die Grainsize. zum (int i = Anfang; i < Ende; i++) { a[i] = f(a[i]); } } anders { int Mittelpunkt = Anfang + (Ende - Anfang) / 2; cilk_spawn Rekursion(a, Anfang, Mittelpunkt); Rekursion(a, Mittelpunkt, Ende); cilk_sync; } } Leere Schleife(int *a, int n) { Rekursion(a, 0, n); }
Die Gründe für die Erzeugung eines Divide-and-Conquer-Programms und nicht die offensichtliche Alternative, eine Schleife, die den Schleifenkörper als Funktion anbietet Einen Engpässe ausbalancieren.[18]
Eine Überprüfung verschiedener paralleler Schleifenkonstrukte auf HPCwire fand die cilk_for Konstrukt, um ziemlich allgemein zu sein, aber bemerkte, dass die Cilk Plus-Spezifikation nicht festgelegt hat, dass seine Iterationen datenunabhängig sein müssen, sodass ein Compiler nicht kann automatisch vektorisieren a cilk_for Schleife. In der Überprüfung wurde auch die Tatsache festgestellt, dass Reduzierungen (z. B. Summen über Arrays) zusätzlichen Code benötigen.[17]
Reduzierer und Hyperobjekte
Cilk ++ fügte eine Art von Objekten hinzu, die aufgerufen wurden Hyperobjekte, das ermöglicht mehrere Stränge, den Zustand ohne zu teilen Rennbedingungen und ohne explizite Schlösser. Jeder Strang hat eine Ansicht auf das Hyperobjekt, das er verwenden und aktualisieren kann. Wenn sich die Stränge synchronisieren, werden die Ansichten auf eine vom Programmierer angegebene Weise kombiniert.[19]
Der häufigste Hyperobjekttyp ist ein Reduzierer, der der Reduktionsklausel in entspricht OpenMP oder zur algebraischen Vorstellung von a Monoid. Jeder Reduzierer hat eine Identitätselement und ein assoziativer Betrieb Das kombiniert zwei Werte. Der archetypische Reduzierer ist Summe Zahlen: Das Identitätselement ist Null und das assoziative reduzieren Der Betrieb berechnet eine Summe. Dieser Reduzierer ist in Cilk ++ und Cilk Plus eingebaut:
// Berechnen Sie ∑ foo (i) für i von 0 bis n parallel. Cilk::Reduder_opadd<schweben> Ergebnis(0); cilk_for (int i = 0; i < N; i++) Ergebnis += Foo(i);
Andere Reduzierer können zum Konstruktion verwendet werden verlinkte Listen oder Strings und Programmierer können benutzerdefinierte Reduzierer definieren.
Eine Einschränkung von Hyperobjects ist, dass sie nur begrenzt liefern Bestimmung. Burckhardt et al. weisen Sie darauf hin, dass selbst der Summenabbau zu nicht deterministischem Verhalten führen kann, was ein Programm zeigt, das entweder erzeugen kann 1 oder 2 Abhängig von der Planungsauftrag:[20]
Leere Add1(Cilk::Reduder_opadd<int> &r) { r++; } // ... Cilk::Reduder_opadd<int> r(0); cilk_spawn Add1(r); wenn (r == 0) { r++; } cilk_sync; Ausgang(r.Wert erhalten());
Array -Notation
Intel Cilk Plus fügt eine Notation hinzu, um hochrangige Ebenen auszudrücken Operationen auf ganzen Arrays oder Abschnitte von Arrays; z. B. an Axpy-Style -Funktion, die normalerweise geschrieben ist
// y ← α x + y Leere Axpy(int n, schweben Alpha, Const schweben *x, schweben *y) { zum (int i = 0; i < n; i++) { y[i] += Alpha * x[i]; } }
kann in cilk plus ausgedrückt werden als
y [0: n] += alpha * x [0: n];
Diese Notation hilft dem Compiler, die Anwendung effektiv zu vectorisieren. Mit Intel Cilk Plus können C/C ++-Operationen parallel auf mehrere Array-Elemente angewendet werden, und bietet auch eine Reihe integrierter Funktionen, mit denen vektorisierte Verschiebungen, Drehungen und Reduktionen durchgeführt werden können. Ähnliche Funktionen existieren in Forran 90; Cilk Plus unterscheidet sich darin, dass es nie temporäre Arrays zuteilt, sodass die Speicherverwendung leichter vorherzusagen ist.
Elementarfunktionen
In Cilk Plus ist eine elementare Funktion eine regelmäßige Funktion, die entweder auf skalaren Argumenten oder auf parallelen Array -Elementen aufgerufen werden kann. Sie ähneln den Kernelfunktionen von OpenCL.
#PRAGMA SIMD
Diese Pragma erteilt dem Compiler die Erlaubnis, eine Schleife auch in Fällen zu vectorisieren, in denen die Auto-Vektorisierung möglicherweise fehlschlägt. Dies ist der einfachste Weg, um die Vektorisierung manuell anzuwenden.
Arbeitsdauer
Der CILK-Scheduler verwendet eine Richtlinie mit dem Namen "Work-Striping", um die Ausführung der Prozedur effizient zwischen mehreren Prozessoren zu teilen. Auch hier ist es am einfachsten zu verstehen, ob wir zuerst darauf achten, wie Cilk-Code auf einer Einzelprozessormaschine ausgeführt wird.
Der Prozessor unterhält a Stapel auf dem es jeden Frame platziert, den es aussetzen muss, um einen Verfahrensanruf zu behandeln. Wenn es ausgeführt wird Fib (2)und trifft auf einen rekursiven Aufruf an Fib (1), es wird retten Fib (2)Der Zustand, einschließlich seiner Variablen und wo der Code die Ausführung aussetzte, und diesen Zustand auf den Stapel versetzt. Es wird keinen suspendierten Zustand vom Stapel entnommen und die Ausführung fortsetzen, bis der Verfahrensanruf, der die Suspendierung verursacht hat, und alle von diesem Verfahren genannten Verfahren vollständig ausgeführt wurden.
Bei mehreren Prozessoren ändern sich die Dinge natürlich. Jeder Prozessor hat immer noch einen Stapel zum Speichern von Frames, deren Ausführung suspendiert wurde. Diese Stapel sind jedoch eher ähnlicher DequesIn diesen suspendierten Zuständen können von beiden Enden entfernt werden. Ein Prozessor kann immer noch nur Zustände von seinem entfernen besitzen Stapel vom gleichen Ende, an dem sie sie anziehen; Jeder Prozessor, der derzeit nicht arbeitet (nachdem er seine eigene Arbeit abgeschlossen hat oder noch nicht zugewiesen wurde), wird durch den Scheduler zufällig einen anderen Prozessor auswählen und versuchen, Arbeiten aus dem anderen Ende ihres Stapels zu "stehlen". Suspendierte Zustände, die der Diebstahlsprozessor dann ausführen kann. Die Staaten, die gestohlen werden, sind die Staaten, aus denen der Prozessor gestohlen wurde, würde sich zuletzt zur Ausführung von Lastin machen.
Siehe auch
- Grand Central Dispatch
- Intel gleichzeitige Sammlungen (CNC)
- Parallele Bausteine in Intel (PBB)
- Intel Array -Bausteine (ARBB)
- Intel Parallel Studio
- Nesl
- OpenMP
- Parallele Computing
- Sieb C ++ Parallele Programmiersystem
- Fadenbausteine (TBB)
- Einheitlich parallel c
Verweise
- ^ Lagrone, James; Aribuki, Ayodunni; Addison, Cody; Chapman, Barbara (2011). Eine Laufzeitimplementierung von OpenMP -Aufgaben. 7. int'l Workshop auf OpenMP. S. 165–178. Citeseerx 10.1.1.221.2775. doi:10.1007/978-3-642-21487-5_13.
- ^ ""Eine kurze Geschichte von Cilk". Archiviert von das Original Am 2015-06-26. Abgerufen 2015-06-25.
- ^ "Das Cilk -Projekt". MIT CSAIL. 8. Oktober 2010. Abgerufen 25. Januar 2016.
- ^ Leiserson, Charles E.; Plaat, Aske (1998). "Programmieren paralleler Anwendungen in Cilk". Siam News. 31.
- ^ "Intel Flexes parallele Programmiermuskeln" Archiviert 2010-09-06 am Wayback -Maschine, HPCwire (2010-09-02). Abgerufen am 09.09.2010.
- ^ "Parallel Studio 2011: Jetzt wissen wir, was mit CT, Cilk ++ und Rapidmind passiert ist." Archiviert 2010-09-26 bei der Wayback -Maschine, Dr. Dobbs Journal (2010-09-02). Abgerufen am 09.09.2010.
- ^ "Intel Cilk Plus: Eine schnelle, einfache und zuverlässige Möglichkeit zur Verbesserung der Gewindeleistung", Intel. Abgerufen am 09.09.2010.
- ^ "GCC 4.9 Release -Serienänderungen, neue Funktionen und Korrekturen", Free Software Foundation, Inc. abgerufen am 2014-06-29.
- ^ Cilk Plus/LLVM
- ^ a b c Hansang B. (20. September 2017). "Intel Cilk Plus wird veraltet". Intel Cilk Plus Forum.
- ^ "GCC 7 Release -Serie. Änderungen, neue Funktionen und Korrekturen". GCC, die GNU Compiler -Sammlung.
- ^ "GCC 8 Release -Serie. Änderungen, neue Funktionen und Korrekturen". GCC, die GNU Compiler -Sammlung.
- ^ "Cilk Hub übernimmt die Cilk -Entwicklung nach Intel -Ankündigung". OpenCilk. 2017-12-01. Archiviert vom Original am 2018-06-12. Abgerufen 2021-12-06.
- ^ "OpenCilk". OpenCilk. Abgerufen 2021-12-06.
- ^ "Release openCilk/v1.0 · openCilk/openCilk-project". GitHub. 2021-03-05. Archiviert vom Original am 2021-12-06. Abgerufen 2021-12-06.
- ^ Blumofe, Robert D.; JOERG, CHRISTOPHER F.; Kuszmaul, Bradley C.; Leiserson, Charles E.; Randall, Keith H.; Zhou, Yuli (1995). CILK: Ein effizientes Multithread -Laufzeitsystem (PDF). Proc. ACM Sigplan Symp. Prinzipien und Praxis der parallelen Programmierung. S. 207–216.
- ^ a b Wolfe, Michael (6. April 2015). "Compiler und mehr: die Vergangenheit, Gegenwart und Zukunft paralleler Schleifen". HPCWire.
- ^ McCool, Michael; Reinsers, James; Robison, Arch (2013). Strukturierte parallele Programmierung: Muster für eine effiziente Berechnung. Elsevier. p. 30.
- ^ Frigo, Matteo; Halpern, Pablo; Leiserson, Charles E.; Lewin-Berlin, Stephen (2009). Reduzierer und andere Cilk ++ Hyperobjekte (PDF). Proc. Jährliches Symposium zur Parallelität in Algorithmen und Architekturen (SPAA). ACM.
- ^ Burckhardt, Sebastian; Baldassin, Alexandro; Leijen, Daan (2010). Gleichzeitige Programmierung mit Überarbeitungen und Isolationstypen (PDF). Proc. Oopsla/SPRITZEN.
Externe Links
- Offizielle Website Für OpenCilk
- Intels Cilk Plus -Website
- CILK -Projektwebsite am MIT
- Bogen D. Robison, "Cilk Plus: Sprachunterstützung für Thread- und Vektorparallelität" und "Parallele Programmierung mit Cilk Plus", 16. Juli 2012.