并行中的Openmp同步

时间:2012-11-19 21:05:46

标签: c multithreading parallel-processing synchronization openmp

我需要做这样的事情

#pragma omp parallel{

#pragma omp for
for_1(){

   for_2(){
     do_something();
   }
   #pragma omp barrier //wait for all threads to finish after the inner for

   continue_with_something_else_in parallel();

}

}

编译器告诉我,我不能在那里设置障碍。有谁知道我怎么解决这个问题?

2 个答案:

答案 0 :(得分:4)

我知道这是一个老帖子,但是因为我发现其他人可能也是......

解决方案:

#pragma omp parallel
{

#pragma omp for schedule(static)
   for_1() {
      for_2() {
        do_something();
      }
   }
   // note implicit barrier after for construct

#pragma omp for shedule(static)
   for_1() {
      continue_with_something_else_in parallel();
   }

}

说明:

OpenMP在" chunks"中安排for循环并将它们分配给线程,这意味着在一个循环迭代中有一个barrier会有问题,因为正在等待的同一个线程也可能被分配了一些其他的循环迭代,所以它会在陷入僵局的状态中等待自己。

但是OpenMP标准确实保证如果你使用schedule(static),单个parallel主体中的相同线程被分配相同的循环迭代并且可以有效地共享内存,这就是我所做的。已完成。

答案 1 :(得分:0)

也许这个链接可以帮到你:

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Fcompiler%2Fref%2Fruompbar.htm

从我看到的内容:

omp barrier指令必须出现在块或复合语句中。例如:

if (x!=0) {
   #pragma omp barrier    /* valid usage    */
}
if (x!=0)
   #pragma omp barrier    /* invalid usage  */