6

我有两个功能,do_step_one(i)do_step_two(i)i0N-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:警告:屏障区域可能不会紧密嵌套在工作共享、关键、有序、主或显式任务区域内。

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

4

2 回答 2

11

顺便说一句,如果要确保不重新创建线程,请将并行声明和 for 声明分开:

#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);
  }
}
于 2011-11-14T17:22:20.970 回答
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);
}

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

于 2009-11-10T18:42:28.460 回答