如何用OpenMP创建中间的所有线程同步的“OMP并行”

如何用OpenMP创建中间的所有线程同步的“OMP并行”,openmp,Openmp,我有两个函数,do\u step\u one(I)和do\u step\u two(I),用于I从0到N-1 目前,我有以下(顺序)代码: 但gcc抱怨道 卷积切片。c:21:警告:屏障区域不能紧密嵌套在工作共享、关键、有序、主任务或显式任务区域内 我误解了什么?如何解决这个问题?我看到这段代码的一个问题是,代码不符合规范:) 如果需要结束所有的do_step_one(),则需要以下内容: #pragma omp parallel for for(unsigned int i=0; i<N

我有两个函数,
do\u step\u one(I)
do\u step\u two(I)
,用于
I
0
N-1

目前,我有以下(顺序)代码:

但gcc抱怨道

卷积切片。c:21:警告:屏障区域不能紧密嵌套在工作共享、关键、有序、主任务或显式任务区域内


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

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

如果需要结束所有的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);
}
#pragma omp parallel for

对于(unsigned int i=0;i只是一个旁注,如果要确保不重新创建线程,请将parallel声明和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);
  }
}
#pragma omp并行
{
#pragma omp for

对于(unsigned int i=0;i您的openMP语法看起来是错误的-对于两个调用,您似乎都缺少
#pragma
-您是否忽略了它?对不起,我忽略了它,但在实际代码中它们就在这里。我已经忘记了我的大部分OMP工作-此方法是否仍然维护线程,或者是否需要为第二个
并行调用重新创建它们el for
?我不确定。这是一个内部实现的问题。从形式上讲,它可以为第二个循环再次创建线程,但我认为它们可能进行了优化以避免这种情况。哦,我想我现在明白了你的目的-第一个for必须结束,第二个才可以开始,因为并行性是m每个区块的ade。要特别确定(可能没有效果),可以在两个循环之间设置一个屏障。并行for的末尾有一个隐式块。也就是说,主线程等待所有线程完成。我只是认为,如果OMP不维护线程,此版本将导致第二次创建线程的开销。这是否会产生差异取决于你是对的,但是我猜他们有一个智能的实现,它不仅仅是杀死和重新创建线程,而是在将来重新使用它们。无论如何,在运行程序时很容易检查它(例如在linux上使用top)。
#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);
}
#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);
  }
}