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

时间:2009-11-10 18:34:45

标签: 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);
}

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

但是gcc抱怨

  

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

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

2 个答案:

答案 0 :(得分:11)

请注意,如果您想确保不重新创建线程,请将并行声明和声明分开:

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

答案 1 :(得分: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);
}

这样做的结果将是第一个的并行性,然后是第二个的并行性。