OpenMP 如何处理并行部分内声明的数据?在 C99 之前,我会使用 private() 子句来指定线程本地数据,例如
int i, x;
#pragma omp parallel for private(x)
for (i=0; i<n; i++) {
x=i;
}
既然 C99 允许混合数据和代码,我更喜欢在使用变量之前声明它们。在循环范围内声明数据是否保证它是线程私有(private)的?例如,以下内容有效吗?
#pragma omp parallel for
for (int i=0; i<n; i++) {
int x=i;
}
我尝试添加 private(x) 以防万一,但我的编译器对象(可能是因为 x 尚未声明)。
最佳答案
某些变量(包括在并行构造中声明的变量)具有预先确定的数据共享属性(例如,您不能将它们声明为共享
或私有(private)
)。这些在 OMP3 标准第 2.9.1.1 节中定义。
在本例中,OpenMP Standard 3.0 ,2.9.1.1:(p78,第 12 行)“在构造内部的作用域中声明的具有自动存储持续时间的变量是私有(private)的。”我很确定 OpenMP 中一直都是这样。所以是的,在您的 C99 示例中,i 和 x 是私有(private)的;另一方面,我理解同一部分说如果 x 被声明为静态,它就会被共享。我认为在这方面,它或多或少符合您的期望。
关于c - OpenMP 和 C99 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711322/