タイトルが非常に不明確である場合は申し訳ありません。私はこれをどのように表現すればよいかよくわかりません。
以下の方法で何とかできないかと考え中です。
#pragma omp parallel
{
for (int i = 0; i < iterations; i++) {
#pragma omp for
for (int j = 0; j < N; j++)
// Do something
}
}
forループでプライベート指定子を省略するなどのことを無視して、内側のループを並列化できるように、外側のループの外側でスレッドをフォークできる方法はありますか? 私の理解では (間違っている場合は訂正してください)、すべてのスレッドが外側のループを実行します。for
内側のループの動作についてはよくわかりませんが、遭遇した各スレッドにチャンクが分配されると思います。
私がやりたいことは、時間を分岐/結合する必要はなくiterations
、外側のループで一度だけ実行することです。これは正しい戦略ですか?
並列化すべきではない別の外部ループがあった場合はどうなるでしょうか? あれは...
#pragma omp parallel
{
for (int i = 0; i < iterations; i++) {
for(int k = 0; k < innerIterations; k++) {
#pragma omp for
for (int j = 0; j < N; j++)
// Do something
// Do something else
}
}
}
OpenMP を使用する際に採用する戦略をよりよく理解できるように、OpenMP を使用して並列化された大規模なアプリケーションの例を誰かが教えてくれたら素晴らしいと思います。見つからないようです。
明確化: ループの順序を変更しない、またはブロック、キャッシュ、および一般的なパフォーマンスの考慮事項を含まないソリューションを探しています。指定されたループ構造で OpenMP でこれを行う方法を理解したいと思います。依存関係がある場合とない場合があります。// Do something
依存関係があり、移動できないと仮定します。