1

我需要做这样的事情

#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();

}

}

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

4

2 回答 2

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();
   }

}

解释:

OpenMPfor在“块”中调度循环并将它们分配给线程,这意味着进行barrier一次循环迭代将是有问题的,因为正在等待的同一个线程也可能被分配了一些其他循环迭代,因此它将等待自己陷入僵局的状态。

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

于 2016-06-29T19:58:16.090 回答
0

也许这个链接会帮助你:

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

据我所知:

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

if (x!=0) {
   #pragma omp barrier    /* valid usage    */
}
if (x!=0)
   #pragma omp barrier    /* invalid usage  */
于 2012-11-19T21:14:07.173 回答