c - OpenMP 和 C99 数据

标签 c openmp c99

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/

相关文章:

c - 我如何知道调制解调器何时完成对 AT 命令的响应?

objective-c - LDAP 身份验证,ldap_sasl_bind_s 不工作但 ldap_simple_bind_s 工作

c - 实际应用中的端依赖代码?

C 和 OpenMP : pointer to shared read-only data slows down execution

c++ - openmp 被 visual studio c++ 优化破坏

c - C 中没有函数指针的运行时代码路径?

c - 关于 OpenMP 的简单问题

c++ - 生成文件 : "ignoring #pragma omp parallel" 的 openmp 问题

c - 释放全局变量

c - 我应该使用哪些 gcc 优化标志?