#define and CUDA

3
为什么以下代码片段在CUDA(包括3.2和4.0版本)中无法工作?
#define NUM_BLOCKS 16

// lots of code.

dim3 dimBlock(NUM_BLOCKS, NUM_BLOCKS);

但是,这个……(需要上下文补充)
dim3 dimBlock(16, 16);

是什么原因呢?

我一直收到一个错误:期望一个“)”错误:期望表达式。我错过了什么吗?

3个回答

9

你确定你没有写错吗?

#define NUM_BLOCKS 16;

注意末尾的分号。

当错误的分号存在时,我会得到你描述的确切错误。


天啊,就这样了!我滚动了一页又一页的预处理代码,结果被一个分号击倒了!我 > 笨蛋。 - Kristian D'Amato
@Kristian:看到了吗...就像我说的,如果你使用了const int或者enum而不是#define,你就不会遇到这个问题:D - Nawaz

2

很奇怪。这可能是由于宏的常见问题造成的。如果您知道,宏不遵守作用域。可能是在其他地方定义了相同的宏,但定义方式不同。

为什么不使用const intenum代替宏呢?

您是否了解:C++ - 枚举 vs. const vs. #define


是的,但原则上它应该可以工作,这就是为什么我觉得很奇怪。 - Kristian D'Amato
@Kristian:就像我所说的,如果存在通常问题,那么它将如何工作?使用宏确保问题不存在是困难的,这就是为什么首选const intenum的原因。 - Nawaz
你是什么意思,Nawaz?我试图将宏重命名为一个明显是用户创建的名称。我不明白为什么它不能工作。无论如何,我会尝试在今天晚些时候找到问题的根源... - Kristian D'Amato

1

找出答案的一种方法是让编译器驱动程序在预处理阶段停止,以便您可以查看生成了什么。这将向您显示预处理器替换了什么,因此给您提供了要搜索的内容。

如果您使用gcc,则选项为-E,如果使用MSVC,则为/E。

对于nvcc编译器驱动程序,典型的命令如下:

nvcc -E file.cu -o file.cup

我怀疑这与NVCC如何看待预处理器命令有关,因为这是一个.cu文件? - Kristian D'Amato
@Kristian D'Amato:我不熟悉CUDA,但我快速查看了nvcc手册,它支持使用“-E”选项从.cu文件生成预处理源代码。我将编辑我的答案并提供一个示例命令行。 - Troubadour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接