1

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、実際のプログラムではディレクティブが使用できなくなります。

このバグを処理するためのトリックがあるのだろうか。残念ながら、私の場合、この問題により 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 threadprivateプラグマ) を指定する必要があります (これは、OpenMP 仕様 - 「OpenMP 2.0」仕様のセクション 2.7.1 でも必要です)。My_Var

于 2012-09-24T09:39:47.773 に答える