2017-05-30 2 views
1

Wie kann ich herausfinden, welche Aufgaben welche Iterationen einer Forall-Schleife ausführen?Aktuelle Aufgaben-ID in Chapel erhalten?

Zum Beispiel, würde Ich mag ein Gefühl dafür bekommen, wie die verschiedenen DynamicIters verhalten,

use DynamicIters; 
var r = 1..1000; 
var A: [r] int; 

forall i in adaptive(r) { 
     A[i] = ???; 
} 

kann ich here.id verwenden, um herauszufinden, was locale eine forall-Schleife auf eine Iteration gesetzt hat, aber ich don Ich weiß nicht, wie ich die Aufgabe im Gebietsschema "sehen" soll, dem jede Iteration zugewiesen wurde.

Antwort

1

Das Chapel-Design vermeidet absichtlich die Unterstützung eines standardmäßigen Sprachtests zur Abfrage der ID einer Aufgabe, da keine bestimmten Nummerierungen oder Gemeinkosten erforderlich sein sollten, um das Feature auf verschiedenen zugrunde liegenden Runtime/OS/Hardware zu verwalten Entscheidungen. Wenn coforall Schleifen schreiben, ein Standard-Trick virtuelle Aufgabe IDs für die Erstellung ist so etwas wie dies zu tun:

coforall (i, tid) in zip(myIter(), 0..) do 

Da jede Iteration der Schleife als separate Aufgabe ausführt, wird tid eindeutig Nummer jeder von ihnen ab 0. Aber wie Sie bemerken, da die Aufgabenerstellung bei der Verwendung von Schleifen in Iteratoren abstrahiert wird, haben sie keine direkte Entsprechung - Sie müssten normalerweise die parallelen Taskkonstrukte in den parallelen Iteratoren ändern, die das sind die Schleife antreiben, um darüber nachzudenken, welche Aufgaben erstellt werden und was sie tun.

Im speziellen Fall des DynamicIters Modul, das Sie neugierig sind, dann ist es ein config param namens debugDynamicIters, die Druckinformationen über unterstützt, was los ist, also, wenn Sie Ihr Programm mit -sdebugDynamicIters=true, Sie kompilieren‘ Ich werde ein Gefühl dafür bekommen, was mit den Aufgaben passiert. Und natürlich können Sie auch die Iteratoren selbst ändern (in $CHPL_HOME/modules/standard/DynamicIters.chpl), um zusätzlichen Debug-Druck hinzuzufügen.

Es ist möglich, außerhalb der Sprache zu gehen und auf die von der Laufzeit verwendeten Task-IDs zuzugreifen. Es gibt jedoch keine Garantie, dass diese über verschiedene Laufzeit-Tasking-Optionen (z. B. qthreads, fifo, massenthreads) portierbar ist weiterhin über zukünftige Versionen von Chapel hinweg arbeiten. Zum Beispiel in Chapel 1.15.0, der folgende Code funktioniert:

extern proc chpl_task_getId(): chpl_taskID_t; 

forall i in adaptive(r) do 
    writeln("task ", chpl_task_getId(), " owns iter ", i); 

Der Typ chpl_taskID_t ein undurchsichtiger Typ ist, der für die Umsetzung interner ist, so kann es ausgedruckt werden, aber es gibt keine Garantie, dass sie Haben Sie einen bestimmten Typ für verschiedene Aufgabenoptionen oder verwenden Sie einen bestimmten Satz von Werten.

+0

Die Interaktion eines Open-Ended-Iterators mit einem Close-Ended-Iterator innerhalb der 'zip (.., ..)' -Augmentation ist eine schöne Syntax-Funktion. Hat es einen Null-Overhead, da es in Kompilier- (Front-End + Back-End) -Zeit gelöst/zugeordnet wurde, oder verursacht es auch einen zusätzlichen Ausführungszeitaufwand? – user3666197

+0

Danke! Es sollte effektiv keinen Overhead haben, wenn wir unsere Arbeit richtig machen. Wir beabsichtigen auch, Benutzern die Möglichkeit zu geben, ihre eigenen Iteratoren mit offenem Ende zu erstellen, die sich ähnlich verhalten (z. B. "so lange wie nötig aus meiner Datendatei lesen ..."), obwohl dies leider noch nicht unterstützt wird. Aus diesem Grund sind grenzenlose Bereiche in der Sprache derzeit eher ein Sonderfall als ideal. – Brad

+0

** Zero-Overhead-Syntaxfunktionen sind nichts weniger als grundlegende Eigenschaften für parallele Sprachen **.Ist es möglich ** das streng zu messen? Wie garantiert Chapel systemweit kohärente Timer auf Deployment-Hardware, um tatsächlich {Clock | Zeitstempel} -the-real - {- Gemeinkosten | -latenzien} bei der Eingabe von parallelen und nur gleichzeitigen Abschnitten von '{coforall | für alle | begin} '& andere {scheduling | Ausführung} Syntax-Features? ** Halten tatsächlich sowohl die 'Timer' -Instanz als auch' getCurrentTime (TimeUnit.microseconds) 'systemweite robuste Taktkohärenz bis zu' TimeUnit.microseconds'? ** – user3666197