Ateji PX

Ateji px
Paradigma objektorientierter, PI -Kalkül
Disziplin tippen stark, statisch
Lizenz kommerzielle, kostenlose 30-tägige Premium-Testversion und kostenlose Ausgabe
Webseite www.ateji.com
Beeinflusst von
Java

Ateji px ist ein objektorientierter Programmiersprache Erweiterung für Java. Es soll verkleinern Parallele Computing an Multi-Core-Prozessoren, GPU, Gitter und Wolke.

Ateji px kann in die integriert werden Eclipse IDEErfordert ein minimales Lernen der zusätzlichen parallele Konstrukte und verändert den Entwicklungsprozess nicht.

Codebeispiele

Hallo Welt

Öffentlichkeit Klasse Hallo Welt {  Öffentlichkeit statisch Leere hauptsächlich(Saite[] Args) {  [  || System.aus.println("Hallo");  || System.aus.println("Welt");  ]  } } 

Jeder || Symbol führt einen parallelen Zweig ein. Das Ausführen dieses Programms wird auch drucken

Hallo Welt

oder

Welt Hallo

Abhängig davon, wie die parallelen Filialen geplant werden.

Datenparallelität

[  || (int i : Array.Länge) Array[i]++; ] 

Die Quantifizierung (int i: n) schafft einen parallelen Zweig für jeden Wert von i. Der Effekt dieses Code besteht darin, alle Elemente von zu erhöhen Array parallel zu. Dieser Code entspricht zu

[  || Array[0]++;  || Array[1]++;  ...  || Array[Array.Länge-1]++; ] 

Komplexere Quantifizierungen sind möglich. Das folgende Beispiel quantifiziert über dem oberen linken Dreieck einer quadratischen Matrix:

[ || (int i:N, int j:N, wenn i+j<N) Matrix[i][j]++; ] 

Code, der eine ähnliche und typischerweise kleine Operation bei einer großen Sammlung von Elementen ausführt, heißt Daten parallelund erscheint oft in leistungsstarken wissenschaftlichen Anwendungen. Ein typischer Repräsentant für datenparallele Sprachen für die C/C ++-oder Forran-Ökosysteme ist OpenMP.

Datenparallelitätsfunktionen können auch von Bibliotheken mit dedizierten Datenstrukturen implementiert werden, wie z. Parallele Arrays.

Aufgabe Parallelität

Die Parallelität der Begriff Aufgabe wird verwendet, wenn die Arbeit konzeptionell in eine Reihe logischer Aufgaben zerlegt werden kann. In diesem Beispiel werden Aufgaben rekursiv erstellt:

int Flunkerei(int n) {  wenn (n <= 1) Rückkehr 1;  int fib1, fib2;  // rekursiv parallele Zweige erstellen  [  || fib1 = Flunkerei(n-1);  || fib2 = Flunkerei(n-2);  ]  Rückkehr fib1 + fib2; } 

Aufgabenparallelität wird in Sprachen wie z. B. implementiert Cilkund in Bibliotheken ähnlich wie die Gabel/Join Paar von Unix -Systemaufrufen.

Nachrichten-Passing

Parallele Zweige haben zwei Arten der Kommunikation; entweder durch gleichzeitig lesen und schriftliche Schreiben gemeinsamer Variablen oder durch Senden explizite Nachrichten. Die Betreiber ! und ? Senden Sie jeweils eine Nachricht auf einem Kanal.

In diesem Beispiel kommunizieren zwei parallele Zweige über explizite Nachrichtenübergabe:

Chan<Saite> Chan = Neu Chan<Saite>(); [  // Branch 1 sendet einen Wert über den Kanal  || Chan ! "Hallo";  // Branch 2 erhält einen Wert aus dem Kanal und druckt ihn aus  || Chan ? s; System.aus.println(s); ] 

Datenfluss

Ein Programm soll sein Datenfluss Wenn die Berechnung durch die Verfügbarkeit von Daten in einem Fluss eingeleitet und synchronisiert wird. Ein typisches Beispiel ist ein Addierer: Es hat zwei Eingänge, eine Ausgabe, und wenn die beiden Eingänge fertig sind, sendet es ihre Summe für die Ausgabe.

Leere Addierer(Chan<Ganze Zahl> in 1, Chan<Ganze Zahl> in 2, Chan<Ganze Zahl> aus) {  zum(;;) {  int Wert1, Wert2;  [ in 1 ? Wert1; || in 2 ? Wert2; ];  aus ! Wert1 + Wert2; }} 

Beachten Sie die parallele Lesen [ in 1 ? Wert1; || in 2 ? Wert2; ]. Dies bedeutet, dass die beiden Eingabewerte in beliebiger Reihenfolge erfolgen können. Ohne ihn kann der Code tadeln, wenn Werte in der falschen Reihenfolge eintreten. Dies zeigt, dass parallele Primitive in einer Programmiersprache nicht nur die Leistung, sondern auch um das Verhalten von Programmen sind.

Der Addierer an sich selbst tut nichts, da er auf Eingabedaten reagiert. Es muss in einen Kontext gestellt werden, in dem andere Teile Eingangswerte und Ausgangswerte lesen. Der Weg, dies auszudrücken, besteht darin, alle Teile in einem großen parallelen Block zu komponieren:

[  || Quelle(C1); // generiert Werte auf C1  || Quelle(C2); // generiert Werte auf C2  || Addierer(C1, C2, C3);  || Waschbecken(C3); // Werte aus C3 lesen ] 

Alles, was als Kombination aus logischen Toren oder elektrischen Schaltungen betrachtet werden kann, kann auf diese Weise als Datenflussprogramm ausgedrückt werden.

Externe Links