宏是否(始终)与 OpenACC 兼容和可移植?

Are macros (always) compatible and portable with OpenACC?

在我的代码中,我定义了不同计算的下限和上限 使用结构的区域,

typedef struct RBox_{
  int ibeg; 
  int iend; 
  int jbeg; 
  int jend; 
  int kbeg;
  int kend;
} RBox;

我接着介绍了下面的宏,

#define BOX_LOOP(box, k,j,i)    for (k = (box)->kbeg; k <= (box)->kend; k++) \
                                for (j = (box)->jbeg; j <= (box)->jend; j++) \
                                for (i = (box)->ibeg; i <= (box)->iend; i++)

(其中box是指向RBox结构的指针)执行如下循环:

#pragma acc parallel loop collapse(3) present(box, data)
BOX_LOOP(&box, k,j,i){
    A[k][j][i] = ...  
}

我的问题是:使用宏是否完全等同于编写 如下所示明确循环 ?

ibeg =  box->ibeg; iend = box->iend; 
jbeg =  box->jbeg; jend = box->jend; 
kbeg =  box->kbeg; kend = box->kend; 

#pragma acc parallel loop collapse(3) present(box, data)
for (k = kbeg; k <= kend; k++){
for (j = jbeg; j <= jend; j++){
for (i = ibeg; i <= iend; i++){
  A[k][j][i] = ...
}}}

此外,宏是否可移植到不同版本的 nvc 编译器?

由于宏由 pre-processor 扩展,它在解释 OpenACC 指令之前运行,我希望这将完全按照您希望的方式工作。如果不在函数中而不是在宏中编写这些循环,您希望在这里完成什么?

预处理器指令和用户定义的宏是 C99 语言标准的一部分,nvc(以及它的前身“pgcc”)已经支持了很长一段时间(~20 年)。所以,yes 可以移植到所有版本的 nvc。

预处理步骤发生在编译过程的早期。只有在应用宏之后,编译器才会处理 OpenACC 编译指示。所以,是的,使用上面的宏等同于显式写出循环。