【问题标题】:Getting error while using openmp in preprocessor directives在预处理器指令中使用 openmp 时出错
【发布时间】:2013-06-20 12:10:19
【问题描述】:

我正在尝试在预处理器指令中使用 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);
}       

有谁知道如何做到这一点?

【问题讨论】:

  • #pragma omp parallel for reduction(+:sum)放在SUM(x);之前

标签: c++ c parallel-processing openmp


【解决方案1】:

在 C 中,从 C99 开始,您拥有 _Pragma 运算符,可让您在宏中放置 pragma,例如

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

顺便说一句,请注意,切勿在宏定义的末尾放置终止 ;

【讨论】:

  • 哇!这是一个更好的答案。我必须在sum=0.0 之后添加一个; 并在SUM(_X_) 之后添加一个反斜杠,但否则它可以工作。我想知道它是否适用于 MSVC。我现在无法测试。
  • 是的,它也可以用 MSVC 完成,但有点不同stackoverflow.com/questions/4782049/…
【解决方案2】:

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

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

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

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

预处理指令中的预处理标记不是 除非另有说明,否则以宏扩展为准

接下来是一个与您的 sn-p 非常相似的示例:

在:

#define EMPTY
EMPTY #include <file.h>

第二行的预处理标记序列不是 预处理指令,因为它在翻译阶段 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) 的名称都保留给实现以供任何使用
  • 以下划线开头的每个名称都保留给实现,用作全局命名空间中的名称

【讨论】:

  • 很好的解释。我不需要阅读标准。我只能阅读你的答案。
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多