带有icc的OpenMP和线程本地存储标识符

这是一个简单的测试代码:

#include  __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 parallel default(none)

我不知道哪种范式(即sharedprivatethreadprivate )适用于这种类型的变量。 哪一个是正确使用的?

我在调用访问该线程局部变量的函数时得到了预期的行为,但是我在显式并行部分中访问它时遇到了麻烦。

编辑:

到目前为止,我最好的解决方案是通过函数返回指向变量的指针

 static inline int * get_a() { return &a; } 

__thread大致类似于threadprivate OpenMP指令的效果。 在很大程度上(读作没有涉及C ++对象时),两者通常使用相同的底层编译器机制实现,因此兼容,但不保证始终有效。 当然,现实世界远非理想,我们有时必须牺牲可移植性来让事情在给定的开发限制范围内工作。

threadprivate是一个指令而不是一个子句,因此您必须执行以下操作:

 #include "header_providing_a.h" #pragma omp threadprivate(a) void parallel_using_a() { #pragma omp parallel default(none) ... ... use 'a' here } 

GCC(至少版本4.7.1)将__thread视为隐式threadprivate声明,您不必执行任何操作。