在预处理程序指令中使用openmp时出错

时间:2013-06-20 12:10:19

标签: c++ c parallel-processing openmp

我试图在预处理程序指令中使用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);
}       

有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

在C中,从C99开始,你有_Pragma运算符,允许你在微帧中放置编译指示,例如。

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

顺便说一句,要小心,不要在宏定义的末尾放置终止;

答案 1 :(得分:1)

OpenMP 3.1 standard第2.1节说明(强调我的):

  

使用pragma指定C / C ++的OpenMP指令   预处理指令

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

例如,在最新的C++ standard draft(第16节)中,您会找到以下内容:

  

预处理指令中的预处理标记不是   除非另有说明,否则须进行宏观扩张

后跟一个非常类似于您的代码段的示例:

  

在:

#define EMPTY
EMPTY #include <file.h>
     

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

无论如何,正如在其他答案中正确陈述的那样,从C99和C ++ 11开始,您可以获得与使用_Pragma运算符所寻求的效果相同的效果。相同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)开头的每个名称都保留给实现以供任何使用
  •   
  • 以下划线开头的每个名称都保留给实现,以用作全局命名空间中的名称
  •