3

私の質問はこのようなものです。でも、違うことをしたい…

たとえば、並列領域内でコードを 4 つのスレッドで実行したいと考えています。各スレッドが for ループに入るときに、コードを 8 つのスレッドで実行したいと考えています。何かのようなもの

#pramga omp parallel num_threads(4)
{
    //do something on 4 threads
    #pragma omp parallel for num_threads(2)
    for(int i=0;i<2;i++){
        //do something on 8 threads in total
    }
}

それで、各(4)実行中のスレッドを2つの(新しい)スレッドに「分割」して、forループ内でより多くの(8)スレッドが実行されるようにする方法はありますか?

4

2 に答える 2

10

ここにあるもの - 1 つの並列セクションが別の内部にあるネストされた並列処理- は、ほとんどの最新の OpenMP 対応コンパイラでサポートされていますが、通常はデフォルトでオフになっています。OMP_NESTEDプログラム呼び出しで、環境変数をTRUE、または に設定する必要がありますomp_set_nested(1)。たとえば、この回答を参照してください。

コメントでフォローアップの質問に答えるために、OpenMP 並列 for ループの最後にバリアは必要ありません。nowaitを使用しない限り、forループの最後に同期のための暗黙のバリアが既に存在します。また、for ループにバリアを配置することはできません。ループの繰り返しがスレッドで均等に分割されていない場合はどうなりますか? いくつかのスレッドが「立ち往生」し、他のスレッドが到達できないバリアで待機することになります。

于 2013-04-08T12:41:27.193 に答える
1

はい、それを行う正しい方法は、選択したものです。2 番目の for ループは、4 つのスレッドごとに分割され、8 つのスレッド最も内側のループを同時に実行できるようになります。

于 2013-04-05T09:41:30.563 に答える