1

Visual Studio 2010 中的 OpenMP 实现似乎有一个严重的错误,不允许将外部变量作为 threadprivate。以下代码无法编译:

文件.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指令在任何实际程序中都无法使用。

我想知道是否有技巧来处理这个错误。不幸的是,就我而言,这个问题使我无法完全使用 OMP。

谢谢,

亚历克斯

4

1 回答 1

3

这似乎是(又一次)违反了 VC++ 编译器中的 OpenMP 标准。幸运的是threadprivate,VC++ 中的子句直接实现为thread __declspec属性的应用,您可以简单地替换:

extern int My_Var;

#pragma omp threadprivate (My_Var)

extern __declspec(thread) int My_Var;

您仍然必须在声明它的所有翻译单元中提供相同的__declspec(thread)属性(或#pragma omp threadprivatepragma)My_Var(根据 OpenMP 规范 - “OpenMP 2.0”规范的第 2.7.1 节也需要)。

于 2012-09-24T09:39:47.773 回答