【发布时间】:2023-03-25 03:20:01
【问题描述】:
我试图告诉我的编译器使用#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 时更改展开参数?
我使用的编译器是CUDA的NVCC编译器。
【问题讨论】:
-
它是否适用于
#define ITEMS 5和#pragma unroll ITEMS,然后是for(..., ii < ITEMS; ...)? -
是的,这会起作用,除了
ITEMS在我的代码中的更多地方使用这一事实,并且将其定义为太多会很奇怪。我也尝试过的是#define ITEMS_PLUS_ONE (ITEMS + 1),但这会给出相同的“额外字符”警告。 -
#define ITEMS_PLUS_ONE 5和#define ITEMS (ITEMS_PLUS_ONE - 1)? (如果可行,丑陋的解决方法总比没有好。) -
哈哈,真有趣。是的,这确实可行,并且将是一个不那么优雅但有效的解决方法。 :-) 我现在会处理它。但我想我正在寻找一个更一般的答案,如果有另一个技巧可以让编译器读取这个 pragma 中的表达式。
-
是的,更好的解决方案肯定会很好。但我不知道如何让预处理器计算
ITEMS + 1以便编译指示得到它想要的单个整数,所以丑陋的解决方法是我能提供的最好的。
标签: c cuda pragma nvcc loop-unrolling