【发布时间】:2013-11-14 14:57:15
【问题描述】:
这是一个简单的测试代码:
#include <stdlib.h>
__thread int a = 0;
int main() {
#pragma omp parallel default(none)
{
a = 1;
}
return 0;
}
gcc 编译这个没有任何问题 -fopenmp,但是 icc (ICC) 12.0.2 20110112 和 -openmp 抱怨
test.c(7):错误:必须在包含 OpenMP 并行编译指示的变量列表中指定“a” #pragma omp 并行默认值(无)
我不知道哪种范例(即shared、private、threadprivate)适用于这种类型的变量。哪一种是正确的?
调用访问该线程局部变量的函数时,我得到了预期的行为,但我无法从显式并行部分中访问它。
编辑:
目前我最好的解决方案是通过函数返回指向变量的指针
static inline int * get_a() { return &a; }
【问题讨论】:
-
混合不同的线程模型可能不是一个好主意。语义上
threadprivate可能是最接近的。由于__thread是一个编译器扩展,您可能找不到很多将它与 OpenMP 链接的文档。 -
您使用的是哪个编译器? GCC 不应要求您为
a提供明确的数据共享类,即使指定了default(none)。 -
@HristoIliev 我正在使用
icc12.0.2。你是对的,这似乎是icc的问题。gcc接受这个。 -
尝试在
a声明后的下一行添加#pragma omp threadprivate(a)。这有点重言式,因为在很大程度上两者都做同样的事情(有一些关于 C++ 对象的例外情况)。 -
@HristoIliev 就是这个!摆脱
__thread说明符并改用#pragma omp threadprivate甚至使我的代码与Mach-O 兼容,因为__thread在Mach-O 可执行文件中不受支持。如果您将此作为答案发布,那么我很乐意为您提供信用。
标签: c openmp icc thread-local-storage