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允许您在宏中放置 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 指令由 pragma preprocessing 指令指定。

现在,在 C 和 C++ 中,您都不允许在宏扩展阶段引入新的预处理器宏,这就是您得到错误的原因。

例如,在最新的C++ 标准草案(第 16 节)中,您会发现以下内容:

预处理指令中的预处理标记不受宏扩展的影响,除非另有说明

后跟一个与您的代码片段非常相似的示例:

在:

#define EMPTY
EMPTY #include <file.h>

第二行的预处理标记序列不是预处理指令,因为它在翻译阶段 4 开始时不以 a开头,即使在宏被替换#后它也会这样做。EMPTY

无论如何,正如其他答案中正确说明的那样,您可以获得与_Pragma自 C99 和 C++11 以来使用运算符所寻求的效果相同的效果。来自同一 C++ 标准草案第 16.9 节的示例:

#pragma 在“..\listing.dir”上列出

也可以表示为:

_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.12) 的名称都保留给实现以供任何使用
  • 每个以下划线开头的名称都保留给实现用作全局命名空间中的名称
于 2013-06-20T12:42:43.433 回答