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次迭代,一个线程必须执行另一个操作,而其他线程等待

问题:gcc 说警告:屏障区域可能没有紧密嵌套在工作共享、关键、有序、主或显式任务区域内

我能做些什么?

4

2 回答 2

0

我认为你的代码是错误的。你说 :

p 的每个元素都必须处理 dtnum 次。

但是 p 的每个元素都将执行 maxThreads*dtnum 次。

您能否更明确地说明您的代码应该做什么?

于 2013-04-19T13:34:43.880 回答
0

很难从非常示意性的代码中分辨出来,但是如果您要做的只是每隔这么多迭代同步一次,那么将迭代循环从并行 omp for 循环中拉出来似乎最容易 - 无论如何这似乎更清楚 - 只需执行

const int iterblocks=50;

#pragma omp parallel shared(p, dtnum) default(none)
for (int jblock=0; jblock<dtnum/iterblocks; jblock++) {
    for (int j=0; j<iterblocks; j++) {
       #pragma omp for nowait
       for (int i=0; i<prt; i++)
           x(p[i]);
    }
    #pragma omp barrier
    #pragma omp single
     g(p);
    #pragma omp barrier
}
于 2013-04-19T17:11:03.370 回答