OpenMP和C99数据

3

OpenMP如何处理在并行部分内声明的数据? 在C99之前,我会使用private()语句来指定线程本地数据,例如:

int i, x;
#pragma omp parallel for private(x)
for (i=0; i<n; i++) {
   x=i;
}

现在C99允许混合数据和代码,我更喜欢在使用变量之前声明它们。在循环范围内声明数据是否保证线程私有?例如,以下内容是否有效?

#pragma omp parallel for
for (int i=0; i<n; i++) {
   int x=i;
}

为了保险起见,我尝试添加private(x),但我的编译器会抱怨(可能是因为x还没有被声明)。


谷歌上快速搜索表明这是真的。C++一直拥有这个特性。 - Ronny Brendel
1
顺便提一下:你在 C90 示例代码中使用了 C99 风格的 for 循环。 - Christoph
1
所谓的C99示例也同样是有效的C90。在ANSI C中,您可以在任何复合语句({...}块)的开头声明任何变量。 - Juliano
谢谢Christoph,我已经修复了这个例子。 - Brian Hawkins
2个回答

2
一些变量,包括在并行结构中声明的变量,具有预定义的数据共享属性(例如,您不能将它们声明为“shared”或“private”)。这些在OMP3标准的2.9.1.1节中定义。
在这种情况下,OpenMP Standard 3.0,2.9.1.1:(第78页,第12行)“在结构内部声明的具有自动存储期限的变量是私有的。”我相当确定在OpenMP中一直都是这样。因此,在您的C99示例中,i和x是私有的;另一方面,我理解同一节说,如果x被声明为静态,则它将是共享的。在这方面,它更或多或少做到了您所期望的。

1

C语言允许在for块内声明x,因此根本没有区别,你应该早就这样做了。

实际上,区别在于i的声明。在C89中,你必须在for循环之前声明这个。 OMP会自动知道循环变量必须对每个线程进行本地化。

int i;
#pragma omp parallel for
for (i=0; i<n; i++) {
   int x=i;
}

在编程方面,C99确实可以简化您的生活并澄清您的代码。


1
在这种情况下,实际上您不必添加 private(i) - 循环变量“在循环结构中隐式地被声明为私有的。”(2.5.1,OpenMP 3标准),因为在并行循环中将其作为共享循环变量是没有意义的。 - Jonathan Dursi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接