2017-12-19 20 views
2

これは私のラップトップで問題なく動作していますが、これが問題になるかどうかは疑問です。私が非常に大きくなる配列を塗りたいとしますが、各エントリは大規模で疎な分散行列に対して強い行列演算を必要とします。私は次のデザインが耐えられると期待するべきですか?チャールでforallを使って配列を塗りつぶし

var x: [1..N] real; 

forall i in [1..N] { 
    x[i] = reallyHeavyMatrixComputation(i); 
} 

これを維持するためのヒントはありますか? xなどのドメインにはdmappedを使用する必要がありますか?

+0

あなたが尋ねようとしている問題は何ですか? '[{P | EXP} TIME]' - スケーリングされたペナルティ**は、[PSPACE] - 分散型マトリクスストレージと、別のレベルの**故意に有害な[{{P | EXP } TIME] ' - スケーリングされたペナルティ**(これは' [PSPACE] ' - 改ざんされた)再フォーマットされた疎な表現形式です。しかし、これらの両方は、規模でその方向に進んでいれば、支払うことを選択するコストです。私は他のいくつかのポイントを逃したのですか – user3666197

+4

簡単な注記:おそらく、より多くの慣用パターンを 'for.i in 1..N'や' forall in in x.domain'を使いたいでしょう。 '[1 ..N] 'は、単一の要素を持つ配列です。範囲は「1..N」です。 – benharsh

答えて

3

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を参照してください。

+0

'distributedDynamic'と' dmapped'バージョンの長所/短所を説明できますか? –

+1

(i)インデックスのセットからロケールへの自然分解がある場合、(ii)分解が合理的に負荷分散されている場合(つまり、各ロケールには同じ数のインデックスと 'reallyHeavyMatrixComputation ()は合理的に一貫しています)、そのオーバーヘッドがより低くなる可能性があるので、 'dmapped'バージョンはおそらく最も良いでしょう。 'distributedDynamic'イテレータは、リソースを利用できるようになり(したがって高価になる)、単純な作業を行うだけで、キャッチオールとしての機能を発揮します。 – Brad

関連する問題