我可以让#Pragma展开接受宏/表达式而不是普通数字吗?

时间:2013-06-04 10:55:42

标签: c cuda pragma nvcc loop-unrolling

我想告诉我的编译器使用#pragma unroll为我展开一个循环。但是,迭代次数由编译时变量确定,因此循环需要多次展开。像这样:

#define ITEMS 4

#pragma unroll (ITEMS + 1)
for (unsigned int ii = 0; ii <= ITEMS; ++ii) 
    /* do something */;

编译器不喜欢这样,因为它给了我以下警告:warning: extra characters in the unroll pragma (expected a single positive integer), ignoring pragma for this loop。我理解这意味着什么:它需要一个整数而不是一个表达式。有没有办法这样做,而不是每次更改ITEMS时都不更改unroll参数?

我使用的编译器是CUDA的NVCC编译器。

1 个答案:

答案 0 :(得分:2)

你可以反过来做到这一点:

注意:在我面前注意到丹尼尔菲舍尔的评论,这完全相同。

#define ITEMS_PLUS_ONE 5
#define ITEMS (ITEMS_PLUS_ONE - 1)

问题是预处理器不做数学运算。它只能复制和粘贴 当您撰写#define ITEMS_PLUS_ONE (ITEMS + 1)时,unroll将替换为(4 + 1),而不是5
一旦到达编译器,它无关紧要。即使没有优化,计算也会在编译期间完成,(4 + 1)5完全相同。
但是在编译器中,#pragma unroll在编译之前会被处理,并且需要简单的数字。