Chapelのforall-loopsは、複数のロケールに拡大縮小できますが、そうするかどうかはループの本体だけでなく、繰り返しの対象によって異なります。
より詳細には、「どのくらいのタスクを使用すべきか」などの重要な並列ループポリシーこれらのタスクはどこで実行する必要がありますか?ループのiterandによって制御されます。たとえば、次のループで:
var x: [1..N] real; // declare a local array
forall i in 1..N do // iterate over its indices in parallel
x[i] = reallyHeavyMatrixComputation(i);
ループのiterandは範囲1..N
あります。デフォルトでは、範囲のイテレータは、現在のロケール上のプロセッサユニット/コアの数に等しい数のローカルタスクを作成します。結果として、reallyHeavyMatrixComputation()
自体に、インテリジェントな方法でロケール全体に計算を分散したon-clauseが含まれていない限り、より多くのロケールが利用されたため、上記のループは高速化しませんでした。 on節をまったく含んでいなければ、計算はロケール#0を離れることはなく、共有メモリのみになります。
逆に、forallループを使用して分散ドメインまたはアレイを反復処理する場合、デフォルトポリシーでは、通常、各ターゲットロケールで、そのロケールのプロセッサコアの数と同じ数のタスクを「所有者「コンピュータ」のように。つまり、各ロケールは、配布によって決定されるように、所有する反復のサブセットを実行します。例えば、ループ所与:
use CyclicDist; // make use of the cyclic distribution module
var D = {1..N} dmapped Cyclic(startIdx=1); // declare a cyclically distributed domain
var x: [D] real; // declare an array over that domain
forall i in D do // iterate over the domain in parallel
x[i] = reallyHeavyMatrixComputation();
D'Sインデックスはロケールを横切って周期的に分散されるので、並列ループは、ロケールのインデックスを実行することを分ける各ロケールにタスクを作成します。その結果、reallyHeavyMatrixComputation()
が完全にローカルな計算であっても、このループは複数のロケールにまたがってスケールされます。
Chapelでスケーラブルな並列ループを作成する別の方法は、ロケール自体に作業を分散する明示的な並列イテレータを呼び出すことです。たとえば、Chapelバージョン1.16には、作業を配布するイテレータを提供するdistributed iteratorsパッケージモジュールが追加されています。それは次のように書き換えた場合、最初の例に戻る:
use DistributedIters; // make use of the distributed iterator module
var x: [1..N] real; // declare a local array
forall i in distributedDynamic(1..N) do // distribute iterations across locales
x[i] = reallyHeavyMatrixComputation(i);
その後、distributedDynamic
イテレータの呼び出しはループのiterand代わりの範囲1..N
および制御タスクの作成になるだろう。このイテレータは、指定されたチャンクサイズ(デフォルトでは1)を使用して、繰り返しロケールを動的に処理するため、スケーラブルな方法で複数のロケールを使用するために使用できます。詳細については、its documentationを参照してください。
あなたが尋ねようとしている問題は何ですか? '[{P | EXP} TIME]' - スケーリングされたペナルティ**は、[PSPACE] - 分散型マトリクスストレージと、別のレベルの**故意に有害な[{{P | EXP } TIME] ' - スケーリングされたペナルティ**(これは' [PSPACE] ' - 改ざんされた)再フォーマットされた疎な表現形式です。しかし、これらの両方は、規模でその方向に進んでいれば、支払うことを選択するコストです。私は他のいくつかのポイントを逃したのですか – user3666197
簡単な注記:おそらく、より多くの慣用パターンを 'for.i in 1..N'や' forall in in x.domain'を使いたいでしょう。 '[1 ..N] 'は、単一の要素を持つ配列です。範囲は「1..N」です。 – benharsh