如何使用OpenMP创建中间所有线程的同步(`barrier`)的`omp parallel for`

Gui*_*ard 6 openmp

我有两个功能,do_step_one(i)并且do_step_two(i),i从... 0N-1.

目前,我有这个(顺序)代码:

for(unsigned int i=0; i<N; i++) {
     do_step_one(i);
}

for(unsigned int i=0; i<N; i++) {
     do_step_two(i);
}
Run Code Online (Sandbox Code Playgroud)

的每次调用do_step_one(),并do_step2()可以以任何顺序和并行执行,但任何do_step_two()需要的全部结束do_step_one(),开始(使用它do_step_one()的结果).

我尝试了以下方法:

#omp parallel for
for(unsigned int i=0; i<N; i++) {
    do_step_one(i);

#omp barrier

    do_step_two(i);
}
Run Code Online (Sandbox Code Playgroud)

但是gcc抱怨道

convolve_slices.c:21:警告:屏障区域可能不会紧密嵌套在工作共享,关键,有序,主要或显式任务区域内.

我有什么误解?如何解决这个问题?

Jas*_*son 11

只是旁注,如果要确保不重新创建线程,请将parallel的声明和声明分开:

#pragma omp parallel
{
  #pragma omp for
  for(unsigned int i=0; i<N; i++){
    do_step_one(i);
  }
  //implicit barrier here
  #pragma omp for
  for(unsigned int i=0; i<N; i++){
    do_step_two(i);
  }
}
Run Code Online (Sandbox Code Playgroud)


Ann*_*nna 4

我看到这段代码的一个问题是该代码不符合规范:)

如果您需要结束所有 do_step_one(),则需要类似以下内容:

#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
     do_step_one(i);
}

#pragma omp parallel for
for(unsigned int i=0; i<N; i++){
     do_step_two(i);
}
Run Code Online (Sandbox Code Playgroud)

其结果将是第一个 for 的并行性,然后是第二个 for 的并行性。