我有一个这样的代码
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的chuck 2)p的每个元素必须被处理dtnum次。处理涉及随机事件 3)每50次迭代,一个线程必须执行另一项操作,而其他线程则等待
问题:gcc 表示警告:屏障区域可能不会紧密嵌套在工作共享、关键、有序、主或显式任务区域内
我能做什么?
最佳答案
很难从非常示意性的代码中看出,但如果您想要做的就是同步每次迭代,那么将迭代循环从并行 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
}
关于c - OpenMP:并行内部同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105381/