Visual Studio 2010中的OpenMP实现似乎有一个严重的错误,它不允许将外部变量作为threadprivate。以下代码无法编译:
file.c
#include <omp.h>
/* Declaration of external variable. */
extern int My_Var;
#pragma omp threadprivate (My_Var)
void MyFunc(void) { My_Var = 1;}
错误消息是:
error C3053:
'My_Var' : 'threadprivate' is only valid for global or static data tems.
显然,编译器对变量的链接属性感到困惑。
最常见的是在多个文件中引用全局变量。所以这个问题使threadprivate
指令在任何现实程序中都无法使用。
我想知道是否有处理这个bug的技巧。不幸的是,在我的情况下,这个问题阻止我完全使用OMP。
谢谢,
亚历
答案 0 :(得分:3)
这似乎是(又一次)违反VC ++编译器中的OpenMP标准。幸运的是,VC ++中的threadprivate
子句直接作为thread
__declspec
属性的应用程序实现,您只需替换:
extern int My_Var;
#pragma omp threadprivate (My_Var)
与
extern __declspec(thread) int My_Var;
仍然必须在声明它的所有翻译单元中向__declspec(thread)
提供相同的#pragma omp threadprivate
属性(或My_Var
pragma)(根据OpenMP规范也是必需的 - 部分2.7.1“OpenMP 2.0”规范)。