2

我试图告诉我的编译器使用#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:我当然理解这意味着什么:它需要一个整数而不是表达式。但是,有没有办法做到这一点,而无需每次更改时都更改 unroll 参数ITEMS

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

4

1 回答 1

2

你可以反过来做:

注意:刚刚注意到 Daniel Fischer 的评论,这表明在我之前完全一样。

#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是在编译之前处理的,并且想要简单的数字。

于 2013-06-04T12:25:10.630 回答