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
が実装への内部です不透明タイプなので、それをプリントアウトすることができますが、それはという保証はありませんタスキング・オプション全体にわたって任意のタイプを持つか、または特定の値セットを使用します。
'zip(..、..)'拡張の中で、オープンエンドのイテレータとクローズエンドのイテレータの相互作用は素敵な構文機能です。コンパイル時(フロントエンド+バックエンド) - 時間に解決/マッピングされているため、ゼロオーバーヘッドを持っていますか、それとも実行時間のオーバーヘッドが発生していますか? – user3666197
ありがとう!私たちが正しく仕事をしているなら、事実上、オーバーヘッドがゼロになるはずです。また、ユーザーが同様に動作するオープンエンドのイテレーターを作成する機能を追加する予定です(たとえば、「必要な限りデータファイルを読み込み」など)。ただし、残念ながらまだサポートされていません。この理由から、無制限の範囲は、現在、理想的ではない言語の特別なケースです。 – Brad
**ゼロオーバーヘッド構文機能は、並列言語**の基本的なプロパティであるに過ぎません。**厳密に**測定することは可能ですか?チャペルは、展開ハードウェア上でシステム全体の一貫性のあるタイマーを確かにどのように保証するのですか?タイムスタンプ} - the-real - { - オーバーヘッド| '{coforall | -latencies}の並行セクションと並行セクションだけを入力すると、 forall |開始} '&other {スケジュール|実行}構文機能? **実際には、 'Timer'インスタンスと' getCurrentTime(TimeUnit.microseconds) 'の両方が 'TimeUnit.microseconds'までシステム全体のロバストなクロックコヒーレンスを保持していますか?** – user3666197