0

私はこのようなコードを持っています

void h(particles *p) {    
    #pragma omp parallel for
    for (int i = 0; i < maxThreads; ++i) {
       int id = omp_get_thread_num();
       for (int j = 0; j < dtnum; ++j) {
           f( p, id);
           if ( j % 50 == 0 ) {
               if (id == 0) {
                   g(p);
               }
               #pragma omp barrier
           }
        }
    }
}
void f(particles *p, int id) {
   for (int i = id * prt_thread; i < (id + 1)*prt_thread; ++i) {
       x(p[i]);
   }
}

基本的に私はしたい: 1) 与えられた量のスレッドを生成します。各スレッドは、スレッドの ID に従って p のチャックを処理します。2) p の各要素は、dtnum 回処理する必要があります。処理にはランダムなイベントが含まれます。3) 50 回の反復ごとに、1 つのスレッドが別の操作を実行する必要があり、他のスレッドは待機します。

問題: gcc は警告を表示します: バリア領域は、ワークシェアリング、クリティカル、順序付き、マスター、または明示的なタスク領域内に密接にネストされていない可能性があります

私に何ができる?

4

2 に答える 2

0

あなたのコードは間違っていると思います。あなたが言った :

p の各要素は dtnum 回処理する必要があります。

ただし、p の各要素は maxThreads*dtnum 回実行されます。

あなたのコードが何をすべきかをもっと明確にできますか?

于 2013-04-19T13:34:43.880 に答える