使用宏为CUDA定义常量

使用宏为CUDA定义常量,cuda,macros,constants,c-preprocessor,Cuda,Macros,Constants,C Preprocessor,我试图减少CUDA内核的指令数和恒定内存读取 因此,我意识到我可以从恒定内存中取出瓷砖大小,并将它们转换为宏。如何定义在预处理期间计算为常量的宏,以便可以简单地调整三个值并减少每个内核中执行的指令数 下面是一个例子: #define TX 8 #define TY 6 #define TZ 4 #define TX2 (TX * 2) #define TY2 (TY * 2) #define OVER_TX (1.0f / float(TX)) 也许这已经是事实(或者可能由nvcc编译器处

我试图减少CUDA内核的指令数和恒定内存读取

因此,我意识到我可以从恒定内存中取出瓷砖大小,并将它们转换为宏。如何定义在预处理期间计算为常量的宏,以便可以简单地调整三个值并减少每个内核中执行的指令数

下面是一个例子:

#define TX 8
#define TY 6
#define TZ 4

#define TX2 (TX * 2)
#define TY2 (TY * 2)

#define OVER_TX (1.0f / float(TX))

也许这已经是事实(或者可能由nvcc编译器处理),但显然我希望第二个宏块由预处理器计算,而不是在代码中替换,这样它就不会在每个内核中执行。有什么建议吗?

现代编译器通常会在编译时尽可能地计算这样的常量,所以您应该没问题。对于正确定义的常量也是如此(即,使用
const
而不是“old skool”
#define
方法)。

如果要使用预处理器defines来实现这一点,最好的做法是将所有内容都括起来,而不是使用“#define TX2 TX*2”do”#define TX2(TX*2)”。这样,如果使用常量的位置的操作优先级等于或高于常量中的操作,则不会出现意外行为。如当前定义的“x/TX2”!=“x/(TX2)”,但这很难找到它是否引起了错误。你完全正确,编辑了答案。还添加了一个更复杂的示例…好的,很好,这是合乎逻辑的。对于更复杂的构造,如#define(1.0f/float(TX))如何?这一点更为关键,不能在运行时执行?如果在编译时知道TX,那么是的,这也应该得到简化。对于像这样的性能关键的东西,尽管您应该养成查看编译器输出的习惯,以查看实际生成的是什么-这可以为如何编写代码提供有用的见解,以充分利用编译器,也可以为微优化提供进一步的想法。