gpt4 book ai didi

c - OpenMP:并行内部同步

转载 作者:行者123 更新时间:2023-11-30 17:52:33 24 4
gpt4 key购买 nike

我有一个这样的代码

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的chuck2)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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com