OpenMP外循环私有或共享

时间:2016-06-15 20:36:06

标签: openmp

我对OpenMP有疑问。我是否将外部循环中的i声明为私有或共享是否有所不同?

int i,j;
#pragma omp parallel for private(j)
for (i=0; i<n; i++) {
    for(j=0; j<n; j++) {
        //do something
    }
}

2 个答案:

答案 0 :(得分:1)

i应该在您的代码中定义为私有。由于每个线程将运行i循环的一部分,每个线程应保持私有i,以便循环体知道他所在的迭代。

然而,更好的方法是在使用变量时定义变量,这样在大多数情况下您都不需要指定它们的属性。在以下示例中,默认情况下,并行for循环中定义的每个变量(i和j)都是私有的。

#pragma omp parallel for
for(int i=0; i<n; i++) {
  for(int j=0; j<n; j++) {
    //do something
  }
}

答案 1 :(得分:1)

从技术上讲,它没有什么区别,因为标准明确指出规范循环形式中的循环变量总是隐式私有。

  

如果以其他方式共享此变量,则在循环结构中隐式将其设为私有。

[{3}}中的2.6

我建议不要宣布它是共享的,对任何试图阅读该程序的人来说都会非常混乱。您可能会争辩说,您可以将变量在循环外部共享并在内部私有,但我无法想到这样的情况。

我希望编译器会在这种情况下给你一个警告,但至少GCC没有。