c - OpenMP:并行内部同步

标签 c parallel-processing synchronization openmp barrier

我有一个这样的代码

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/

相关文章:

python - 使用python的multiprocessing和process defunc进行并行编程

Python 中的 C# Parallel.Foreach 等价物

memory-management - 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

java - 在更新删除和插入时将电话簿联系人与我的应用程序同步的最佳方式

multithreading - 托管 C++ 中的 C# 的 lock()

c - fflush、fsync 和 sync 与内存层

c - 论点中的指针,&符号?

c++ - test.c :(. text+0x36): 未定义对 `md5_file' 的引用

C Makefile - 如何避免重复提及文件名

c - 从 Linux 内核向 LOOPBACK 发送小的 UDP 数据包