这是一个简单的测试代码:
#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): error: "a" must be specified in a variable list at enclosing OpenMP parallel pragma #pragma omp parallel default(none)
我不知道哪种范例(即shared
、private
、threadprivate
)适用于这种类型的变量。哪一种是正确的使用方法?
在调用访问该线程局部变量的函数时,我得到了预期的行为,但在显式并行部分中访问它时遇到了问题。
编辑:
到目前为止,我最好的解决方案是通过函数返回指向变量的指针
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
声明,您无需执行任何操作。
关于c - OpenMP 和带有 icc 的线程本地存储标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980937/