宏是否(始终)与 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 编译指示。所以,是的,使用上面的宏等同于显式写出循环。
在我的代码中,我定义了不同计算的下限和上限 使用结构的区域,
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 编译指示。所以,是的,使用上面的宏等同于显式写出循环。