我对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
}
}
答案 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没有。