gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:23 25 4
gpt4 key购买 nike

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

#define ITEMS 4

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

不过,编译器不喜欢这样,因为它给我以下警告:警告:展开编译指示中的额外字符(应为单个正整数),忽略此循环的编译指示。我当然明白这意味着什么:它需要一个整数而不是一个表达式。但是,有没有办法做到这一点,而无需在每次更改 ITEMS 时都更改 unroll 参数?

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

最佳答案

你可以反过来做:

注意:刚刚注意到 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 在编译之前被处理,并且需要简单的数字。

关于我可以让#Pragma unroll 接受宏/表达式而不是普通数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16916028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com