【问题标题】:#define and CUDA#define 和 CUDA
【发布时间】:2011-03-06 12:05:05
【问题描述】:

为什么以下 sn-p 不适用于 CUDA(3.2 和 4.0)?

#define NUM_BLOCKS 16

// lots of code.

dim3 dimBlock(NUM_BLOCKS, NUM_BLOCKS);

但是这个,

dim3 dimBlock(16, 16);

会吗?

我不断收到error : expected a ")"error : expected an expression。我错过了什么?

【问题讨论】:

    标签: c++ cuda c-preprocessor


    【解决方案1】:

    你确定不是你写的

    #define NUM_BLOCKS 16;
    

    (注意末尾的分号)?

    当有错误的分号时,我得到了你所描述的错误。

    【讨论】:

    • 见鬼,就是这样!我正在滚动浏览一页又一页的预处理代码,只是被分号放低了!我>doofus。
    • @Kristian: 看...正如我所说,如果你使用const intenum 而不是#define,你就不会遇到这个问题:D
    【解决方案2】:

    这很奇怪。这可能是因为宏的常见问题。如果您知道,宏不尊重范围。可能在其他地方定义了相同的宏,但不同。

    为什么不使用const intenum 而不是宏?

    你知道吗:C++ - enum vs. const vs. #define??

    【讨论】:

    • 是的,但原则上至少它应该可以工作,这就是我觉得奇怪的原因。
    • @Kristian:正如我所说,如果出现通常的问题,那么它将如何工作?确保问题不存在,使用宏很难,这就是为什么首选const intenum
    • 纳瓦兹是什么意思?我尝试将宏重命名为明显是用户创建的宏。我不明白为什么它不应该工作。无论如何,我会在今天晚些时候尝试彻底解决这个问题......
    【解决方案3】:

    找出答案的一种方法是让编译器驱动程序在预处理阶段之后停止,以便您可以看到生成的内容。这将向您显示预处理器替换的内容,从而为您提供搜索的内容。

    如果您将 gcc 和 /E 用于 MSVC,则选项是 -E。

    对于 nvcc 编译器驱动程序,一个典型的命令是

    nvcc -E file.cu -o file.cup
    

    【讨论】:

    • 我怀疑这与 NVCC 如何看待预处理器命令有关,因为这是一个 .cu 文件?
    • @Kristian D'Amato:我不熟悉 CUDA,但我只是快速浏览了一下 nvcc 手册,它说它支持 -E 选项以从 .cu 生成预处理源文件。我将使用示例命令行编辑我的答案。
    猜你喜欢
    • 2011-06-25
    • 2011-09-17
    • 2016-01-11
    • 2014-01-16
    • 2017-04-23
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多