2017-05-30 4 views
1

forallループのどの繰り返しがどのタスクで実行されているかを知るにはどうすればよいですか?Chapelで現在のタスクIDを取得しますか?

例えば、私は

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

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

私はループFORALLに 反復を入れているロケールものを発見するためにhere.idを使用することができますが、私ドン、異なるDynamicItersがどのように動作するかの感触を取得したいのですが各反復が割り当てられたロケール内のどのようなタスクを「見る」方法が分かりません。

答えて

1

Chapelの設計では、タスクのIDを照会するための標準的な言語レベルの方法をサポートすることを意図的に避けています。これは、固有のランタイム/ OS /ハードウェア間で機能を維持するために必要な特定の番号付けやオーバーヘッド選択肢。 coforallループを書くときに、仮想タスクIDを作成するための標準的なトリックは、このような何かを行うことです。

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

ループの各反復は、別のタスクとして実行されるため、tidは一意で始まるそれらのそれぞれに番号をします0。しかし、あなたが指摘しているように、タスクの作成は、forallループを使用するときに抽象化されているので、それらは簡単には同等ではありません。通常、並列反復子のタスク並列構造を変更する必要があります。どのようなタスクが作成されているのか、そして何をしているのかを判断するためにループを駆動します。あなたは好奇心だDynamicItersモジュールの特定の場合には

、あなたが-sdebugDynamicIters=trueとあなたのプログラムをコンパイルので、もし何が起こっているのかについての印刷情報をサポートしていますdebugDynamicItersという名前config paramはあなたが、そこには」タスクで何が起こっているのかを知ることができます。もちろん、イテレータ自体($CHPL_HOME/modules/standard/DynamicIters.chplにあります)を変更して、デバッグ印刷を追加することもできます。

ランタイムで使用するタスクIDにアクセスすることは可能ですが、これは異なるランタイムタスクオプション(qthreads、fifo、massivethreadsなど)で移植できる保証はありません。チャペルの将来のバージョンを越えて作業を続けます。例えば、チャペル1.15.0に、次のコードは動作します:

extern proc chpl_task_getId(): chpl_taskID_t; 

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

タイプchpl_taskID_tが実装への内部です不透明タイプなので、それをプリントアウトすることができますが、それはという保証はありませんタスキング・オプション全体にわたって任意のタイプを持つか、または特定の値セットを使用します。

+0

'zip(..、..)'拡張の中で、オープンエンドのイテレータとクローズエンドのイテレータの相互作用は素敵な構文機能です。コンパイル時(フロントエンド+バックエンド) - 時間に解決/マッピングされているため、ゼロオーバーヘッドを持っていますか、それとも実行時間のオーバーヘッドが発生していますか? – user3666197

+0

ありがとう!私たちが正しく仕事をしているなら、事実上、オーバーヘッドがゼロになるはずです。また、ユーザーが同様に動作するオープンエンドのイテレーターを作成する機能を追加する予定です(たとえば、「必要な限りデータファイルを読み込み」など)。ただし、残念ながらまだサポートされていません。この理由から、無制限の範囲は、現在、理想的ではない言語の特別なケースです。 – Brad

+0

**ゼロオーバーヘッド構文機能は、並列言語**の基本的なプロパティであるに過ぎません。**厳密に**測定することは可能ですか?チャペルは、展開ハードウェア上でシステム全体の一貫性のあるタイマーを確かにどのように保証するのですか?タイムスタンプ} - the-real - { - オーバーヘッド| '{coforall | -latencies}の並行セクションと並行セクションだけを入力すると、 forall |開始} '&other {スケジュール|実行}構文機能? **実際には、 'Timer'インスタンスと' getCurrentTime(TimeUnit.microseconds) 'の両方が 'TimeUnit.microseconds'までシステム全体のロバストなクロックコヒーレンスを保持していますか?** – user3666197

関連する問題