这是一个简单的测试代码:
#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 parallel default(none)
我不知道哪种范例(即shared
,private
,threadprivate
)适用于此类变量。哪一个是正确使用的?
在调用访问该线程局部变量的函数时,我得到了预期的行为,但是我在显式并行部分中访问它时遇到了麻烦。
修改
到目前为止,我最好的解决方案是通过函数返回指向变量的指针
static inline int * get_a() { return &a; }
答案 0 :(得分:3)
__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
声明,您无需执行任何操作。