我想告诉我的编译器使用#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编译器。
答案 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
在编译之前会被处理,并且需要简单的数字。