预处理器命令(#if定义)在CUDA程序中不起作用?

时间:2012-10-31 20:59:02

标签: c cuda c-preprocessor nvcc

在这段代码中,我希望MatrixMultiplication()方法中的“printf”命令能够显示其文本。它没有,即使在前一行声明了“size”并且“test”设置为1.这是代码:

void MatrixMultiplication(float * M, float * N, float * P, int Width, int test)
{
        int size = Width * Width * sizeof(float);

        #if defined size
        if (test)
        {
                printf("Should be equal to %d.  Int size:%d", Width * Width * sizeof(float), size);
        }
        #endif
}

int main (int argc, char ** argv)
{

        // Omitted for brevity...

        int test = 1;                                                   

        // Omitted for brevity...

        MatrixMultiplication(hostM, hostN, reference, atoi(matrix_id), test);

        // Omitted for brevity...

}

我正在使用此命令进行编译:

nvcc -I/home/sbu/NVIDIA_GPU_Computing_SDK/C/common/inc -L/home/sbu/NVIDIA_GPU_Computing_SDK/C/lib -o matrixmul matrixmul.cu -lcutil_x86_64

是否有关于nvcc的内容使得这种“#if defined”命令不起作用?我之前在使用gcc的原生 C 和C ++代码中使用过这种语法,它运行得很好。

对这个问题的任何启发都会很棒!

以下是Pastebin上的完整代码:http://pastebin.com/SusnpgFc

2 个答案:

答案 0 :(得分:2)

  

它没有,即使已经在前一行声明了“大小”

#if defined size测试是否已定义具有该名称的预处理器宏,它不检查是否在程序中声明了具有该名称的变量。

如果您之前有#define size#define size some replacement tokens,则只会评估为真。

答案 1 :(得分:1)

预编译在编译之前完成。因此,当预处理器检查时:

#if defined size

size未在任何地方定义,因此已替换为0。因此,在传递给编译器之前,整个if代码段不会被删除。