1
私はこれについてになりますC++のOpenMPコードを持っています。私の問題は、スレッディングの両方の層にまたがる障壁が必要だということです。現在のところ、8スレッドの各レベル2グループはグループメンバーを待機しますが、1グループが終了すると、8スレッドの他のグループに関係なく移動します。トップレベルで動作する障壁をつくる方法はありますか? (L2並列領域を終了せずに再作成する)OMPバリアネストされたスレッドが
私はこれについてになりますC++のOpenMPコードを持っています。私の問題は、スレッディングの両方の層にまたがる障壁が必要だということです。現在のところ、8スレッドの各レベル2グループはグループメンバーを待機しますが、1グループが終了すると、8スレッドの他のグループに関係なく移動します。トップレベルで動作する障壁をつくる方法はありますか? (L2並列領域を終了せずに再作成する)OMPバリアネストされたスレッドが
barrier
指示は現在のチームにのみ適用されるため、レベル2の指示に従ってください。本当にこのレベル2を終了することはできない場合は、その後、私はこのような何かが仕事ができることを推測する:
int nbDone = 0;
#pragma omp parallel proc_bind(spread), num_threads(ncpu)
{
<some code>
#pragma omp parallel proc_bind(close), num_threads(ncore)
{
<some more code...>
// here is the "inter-team barrier"
#pragma omp atomic update
++nbDone;
bool allDone = false;
while (!allDone) {
#pragma omp barrier
#pragma omp atomic read
allDone = nbDone == ncpu * ncore;
}
// End of the "inter-team barrier"
}/* End of Level 2 threads*/
}/* End of Level 2 threads*/
私はそれをテストしていませんが、私はそれが動作するはずだと思います。しかし、私はまだあなたのL2チームを終了するだけで良いと信じて、barrier
をL1に置き、L2チームを取り戻す...
申し訳ありませんが、私はそれらの例を忘れています...実際のコードは – Joel
ですが、合計スレッドが100kだった場合は、各バリアで100kスタックをメモリ間で切り替える必要があります。 –