0

プリプロセッサ ディレクティブで OpenMP コードを使用しようとしていますが、コードのコンパイル中にエラーが発生します。私は以下のようなことをしようとしています。

 #include<stdio.h>
 #include<omp.h>
 #define SUM(_X_)
 sum=0.0                            \
 /*I want to put openmp     
  parallel for directive here       \   
 i.e., #parallel for reduction(+:sum)\
  */                                 \
 for (i = 0 ; i < 10 ; i++)          \  
    sum += _X_[i];              \
int main()
{
   int i=0,x[10];
   float sum=0;
   for(i=0;i<10;i++)
      x[i]=i;
   SUM(x);
}       

これを達成する方法を知っている人はいますか?

4

2 に答える 2

2

C では、C99 以降、_Pragmaマクロ内にプラグマを配置できる演算子があります。

#define SUM(_X_)                         \
sum=0.0;                                 \
_Pragma("parallel for reduction(+:sum)") \
for (i = 0 ; i < 10 ; i++)               \
    sum += _X_[i]

ところで、注意;してください。マクロ定義の最後に終端を置かないでください。

于 2013-06-20T14:27:37.167 に答える
1

OpenMP 3.1 標準のセクション 2.1 には、次のように記載されています (強調は私のものです)。

C/C++ の OpenMP ディレクティブは、プラグマ preprocessing ディレクティブで指定されます。

現在、C と C++ の両方で、マクロ展開フェーズ中に新しいプリプロセッサ マクロを導入することは許可されていないため、エラーが発生します。

たとえば、最新のC++ 標準ドラフト(セクション 16) では、次のことがわかります。

特に明記しない限り、前処理ディレクティブ内の前処理トークンはマクロ展開の対象ではありません。

次に、スニペットによく似た例を示します。

の:

#define EMPTY
EMPTY #include <file.h>

#2 行目の一連の前処理トークンは、変換フェーズ 4 の開始時にa で始まっていないため、前処理ディレクティブではありませんEMPTY

_Pragmaとにかく、他の回答で正しく述べられているように、C99 および C++11 以降の演算子を使用して、求めているものと同じ効果を得ることができます。同じ C++ 標準ドラフトのセクション 16.9 の例:

"..\listing.dir" の #pragma リスト

次のように表現することもできます。

_Pragma ( "listing on \"..\\listing.dir\"" )

後者の形式は、次のように文字どおり表示されるか、マクロ置換の結果であるかに関係なく、同じ方法で処理されます。

#define LISTING(x) PRAGMA(listing on #x)
#define PRAGMA(x) _Pragma(#x)
LISTING( ..\listing.dir )

最後に、名前の選択に注意してください。実装用に予約され_X_ている可能性がある名前です (セクション 17.6.4.3.2)。

名前と関数シグネチャの特定のセットは、常に実装用に予約されています。

  • 2 つのアンダースコアを含む名前、__またはアンダースコアで始まり、その後に大文字が続く名前 (2.12) は、実装で使用するために予約されています。
  • アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装に予約されています
于 2013-06-20T12:42:43.433 に答える