openmpのプライベート変数はどこに割り当てられますか?各スレッドスタック上で、動的に、または共有配列などを介して?OpenMPプライベート変数の場所?
答えて
OpenMP仕様では、変数がスタックまたはヒープに割り当てられるかどうかは指定されていません(ヒープ上にある場合、共有アレイ内にある場合、またはスレッドごとに1つのオブジェクトが割り当てられている場合)。一般的に私は、プライベート変数がスタックに割り当てられていると仮定します(そうしなければならない理由はなく、一般的により効率的です)。 the manualによると、libgomp(gccで使用されている実装)で使われている動作ですが、他の実装についてのヒントはありません。
OpenMPはプライベート変数の割り当てについて何も指定しません。
ヒープとスタックの2つのオプションがあります。
各スレッドが命令の数を減らしていると考えると、マスタスレッドは以下のようなプライベート変数を割り当てるのが理にかなっています。
コード:
1: set_threads(n)
2: #pragma omp parallel private(var)
3: {
4: var = ...
5:}
マシンコード:
LINE2:var_ptr =新しい変数[n]は
LINE4:var_ptr [get_thread_id()] = ...
しかし、上記のコードは、異なるスレッドのプライベート変数の間で多くの偽の共有を引き起こします。だから、私は、コンパイラが各スレッドのスタックにそれらを割り当てることは理にかなっていると思います。
これに関する参考情報はありますか?仕様はそれを指定しているようではなく、単にスタックに割り当てるのと比べて非効率的に見えます。さらに、[this](http://gcc.gnu.org/onlinedocs/libgomp.pdf)によると、少なくともlibgompはそれをそうしていません。 'private'データの割り当てを避けるためには、どのような指示があるのでしょうか? – Grizzly
共有!=プライベートとあなたが示した擬似コードは、このコードがほとんどの(=キャッシュ一貫性のある)CPUアーキテクチャ上で主要なパフォーマンスを殺す偽の共有を引き起こすので、間違いなく完全に間違っています。 –
@above ..オハイオ州のおい...私はあなたのポイントを今得た。問題は、実行された命令の数を最小限に抑えるという開発者の考えから考えていたことです。ヒープにプライベート変数を割り当てると、プライベート変数に対応するためにスタック・ポインタを減らすすべてのスレッドと比較して、マスター・スレッドだけがmallocを実行するようになります。しかし、これは確かに長期的には私的変数間の誤った分担を誘発するだろう。それを指摘してくれてありがとう。 PS:編集したポストを見てください。 –
- 1. モジュール内のプライベートとパブリック変数とOpenMPのサブルーチン
- 2. プライベート変数が
- 3. チラシのユーザーの場所の変数
- 4. プライベートvsパブリック変数
- 5. ヘッダーの場所への変数
- 6. OpenMP for C++クラス変数
- 7. バックボーンビューへのプライベート変数とパブリック変数
- 8. モカユニットテスト:変数の作成場所
- 9. .net 4.0タスクのプライベート変数
- 10. スレッド内のプライベート変数
- 11. javascriptのプロトタイプとプライベート変数
- 12. Ember-data DS.Modelのプライベート変数
- 13. 未定義のプライベート変数
- 14. SQLAlchemy、プライベート変数のフィールド
- 15. プライベート変数へのアクセス
- 16. Codeigniter:URLから変数を置く場所
- 17. デザインガイドライン:変数を定義する場所
- 18. Googleマップ:いくつかのプライベートの場所(場所アプリによってのみ照会可能)
- 19. 継承とプライベート変数C++
- 20. C++プライベート変数スコープ規則
- 21. openMP - 変数とアトミックへの同時アクセス
- 22. 共有変数やOpenMPのでOpenACC
- 23. OpenMPの並列セクションでポインタをプライベートにしていますか?
- 24. ループインデックスをOpenMPのプライベート変数として設定する必要はありますか?
- 25. 適切なC関数の引数変数の定義場所
- 26. 変更MouseEventArgs場所
- 27. Egit(Eclipse)のユーザーの場所(ホーム変数)を変更する
- 28. PortAudioのコールバックと他の場所で変数を変更する
- 29. OpenMP SECTIONSディレクティブを使用すると、プライベート変数がガベージ値として出力されます
- 30. あなたの場所を偽の場所に変更する
私は思っただろう、それは意味をなさない。ありがとう。 –