实现以下代码时:
#pragma omp parallel for default(shared) private(rx,ry,a, Xmax,Ymax)
for (a=0;a<30000;a++)
{int mn,mnn;
mn=part.i;
mnn=part.j;
setup(mn,mnn,a);
}
功能设置使用全局变量rx,ry,Xmax和Ymax。 Open MP是否注意到这些被声明为私有?或者如果在循环中存在的函数中调用全局变量会发生什么?
答案 0 :(得分:0)
除非使用threadprivate
,否则将共享函数中使用的全局变量。因此,如果您在函数中调用它们,rx,ry, Xmax,Ymax
将不会是私有的,除非您使用threadprivate
。
使用和不使用threadprivate尝试以下代码并查看结果。
#include <stdio.h>
int x;
//#pragma omp threadprivate(x)
void foo() {
printf("%p\n", &x);
}
int main() {
//#pragma omp parallel
#pragma omp parallel private(x)
{
printf("%p\n", &x);
foo();
}
}
请参阅“a。中引用的变量的数据共享属性规则”下的OpenMP specificiation 区域但不在构造“
中区域中被调用例程中引用的文件范围或命名空间范围变量是共享的,除非它们出现在threadprivate指令中。