【问题标题】:OpenMP: synchronization inside parallel forOpenMP:并行内部同步
【发布时间】:2013-04-12 21:24:11
【问题描述】:

我有一个这样的代码

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 发出警告:屏障区域可能没有紧密嵌套在工作共享、关键、有序、主或显式任务区域内

我能做什么?

【问题讨论】:

    标签: c parallel-processing synchronization openmp barrier


    【解决方案1】:

    很难从非常示意性的代码中分辨出来,但如果您要做的只是每隔这么多迭代同步一次,似乎最容易将迭代循环从并行 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
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 线程 id 被传递给 f。 id 用于将数组 p 分成大小相等的块。 f 做什么无关紧要,但我会添加一个示例
      猜你喜欢
      • 2012-11-07
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多