#pragma omp parallel
の最初にスレッドの束が作成され、#pragma omp for
に到達するとワークロードが分散されます。このforループの中にforループがある場合はどうなりますか?また、その前に#pragma omp for
を置きますか?各スレッドは新しいスレッドを作成しますか?そうでなければ、どのスレッドにこのタスクが割り当てられていますか?この状況ではどういうことが起こりますか?プラグマの内部にプラグマがある場合、OpenMPではどうなりますか?
2
A
答えて
3
デフォルトでは、内部ループ用にスレッドが生成されません。それは、それに到達するスレッドを使用して順次行われます。
これは、デフォルトでネストが無効になっているためです。ただし、omp_set_nested()
でネストを有効にすると、新しいスレッドセットが生成されます。
ただし、慎重でないと、元のスレッドのそれぞれがp
スレッドを生成するため、p^2
のスレッド数になります。したがって、ネストはデフォルトでは無効になっています。次のような状況では
1
:
#pragma omp parallel
{
#pragma omp for
for(int ii = 0; ii < n; ii++) {
/* ... */
#pragma omp for
for(int jj = 0; jj < m; jj++) {
/* ... */
}
}
}
何が起こることは、あなたがOpenMPの標準に違反するとして、あなたは未定義の動作をトリガーするということです。以下の制限がワークシェアリング構造に適用されます
:
- 各ワークシェアリング領域がチームにまたはnoneにより、すべてのスレッドが遭遇しなければならないより正確には、あなたは、セクション2.5(ワークシェアリング構造)に登場するの制限に違反しますまったく。
- 発生したワークシェアリング領域とバリア領域の順序は、チーム内のすべてのスレッドで同じでなければなりません。
これは明らかに実施例A.39.1c and A.40.1cに示されている:
例A.39.1c:内側と外側のループ領域が別に結合するためをネストループ構造の以下の例は、適合されています平行 領域:
void work(int i, int j) {}
void good_nesting(int n)
{
int i, j;
#pragma omp parallel default(shared)
{
#pragma omp for
for (i=0; i<n; i++) {
#pragma omp parallel shared(i, n)
{
#pragma omp for
for (j=0; j < n; j++)
work(i, j);
}
}
}
}
例A.40.1c次の例で、内側と外側のループ領域が密接にこれが異なっていること
void work(int i, int j) {}
void wrong1(int n)
{
#pragma omp parallel default(shared)
{
int i, j;
#pragma omp for
for (i=0; i<n; i++) {
/* incorrect nesting of loop regions */
#pragma omp for
for (j=0; j<n; j++)
work(i, j);
}
}
}
お知らせ入れ子になっているので、不適合です:あなたは、ネストされたを起動しようとする
#pragma omp parallel for
for(int ii = 0; ii < n; ii++) {
/* ... */
#pragma omp parallel for
for(int jj = 0; jj < m; jj++) {
/* ... */
}
}
すると平行領域。この場合のみ、神秘的な答えの議論が成立する。
関連する問題
- 1. プラグマ内でOpenMPプラグマを処理する方法
- 2. コンパイラがOpenMPプラグマを無視するのはなぜですか?
- 3. ブロッキング・ループに使用するopenMPプラグマはどれですか?
- 4. OpenMPの "master"プラグマを "parallel for"プラグマで囲んではいけません
- 5. エラーC2156:プラグマが関数外にある必要があります - この場合、どうしてですか?
- 6. プラグマOMP平行は、OpenMPとC++で
- 7. openMP条件付きプラグマ "else else"
- 8. の#define内のOpenMPプラグマを使用して
- 9. この場合、UNPACKプラグマは何をしますか?
- 10. SQLiteにプラグマの整合性チェック用の冗長オプションはありますか?
- 11. 文字列がデフォルトで不変である場合、どのように変更可能な文字列を記述できますか?ファイルは、プラグマあり
- 12. レキシカルスコープのプラグマ
- 13. プラグマompのショートカット
- 14. アレイでのC++プラグマompセグメンテーションフォールト(データ競合?)
- 15. SQLite3プラグマは永続的ではありません
- 16. avraアセンブラ - プラグマ?
- 17. ビットフィールドとプラグマ
- 18. OpenMPプラグマの結果としての中間コード
- 19. 関数にINLINABLEプラグマを使用しない理由はありますか?
- 20. 英語のプラグマ:legacy?
- 21. プラグマの使い方
- 22. プラグマのインストールエラーコード:INTERNAL_ERROR jdeveloper
- 23. haskell - LANGUAGEプラグマのグループをロールする方法はありますか?
- 24. オブジェクト内にデータが隠されている場合にintel prefetchプラグマを使用するには?
- 25. プラグマを使用してソースファイルを追加する方法はありますか?
- 26. Mooseのプラグマ自動エクスポートをどのように拡張できますか?
- 27. Windows上でプラグマompを設定する
- 28. GolangでSQLiteプラグマuser_versionを取得する
- 29. UndecidableInstancesプラグマをローカルで使用すると、コンパイル終了時にグローバルな影響がありますか?
- 30. intが丸括弧内にある場合はどうなりますか?
あなたの答えは、OPによって尋ねられたものとは異なる状況に対処しているという意味で間違っていると思います。 – Massimiliano
@Massimilianoうーん...良い点。しかし、あなたがあなたの答えで主張しているUBを確認することも拒否することもできません。私はこれら2つの箇条書きの解釈が異なっているようです。 – Mysticial
あなたの解釈は何ですか?少なくとも、あなたは 'n%nthreads!= 0'、スケジュールは 'static'ではないので、ポイント2は常に違反していますか? – Massimiliano