在Cuda 4.0编译错误中使用printf()

时间:2011-11-03 23:21:03

标签: cuda printf

我有一台GTX 570(Fermi架构),它具有计算能力2.0。我的计算机上有Cuda 4.0版 我正在使用Ubuntu 10.10

使用Cuda 4.0,可以在内核中使用printf()。以下是Cuda 4.0 programming guide

第125页的示例代码
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ < 200)
#define printf(f, ...) ((void)(f, __VA_ARGS__),0)
#endif


__global__ void helloCUDA(float f)
{
printf(“Hello thread %d, f=%f\n”, threadIdx.x, f);
}



void main()
{
helloCUDA<<<1, 5>>>(1.2345f);
cudaDeviceReset();
}

我收到以下编译错误。

gaurish108 MyPractice: nvcc printf_inkernel.cu -o printf_inkernel
printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(10): error: expected an expression

printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(10): error: unrecognized token

printf_inkernel.cu(15): warning: return type of function "main" must be "int"

8 errors detected in the compilation of "/tmp/tmpxft_000014cd_00000000-4_printf_inkernel.cpp1.ii".

为什么不识别printf?我尝试添加标记-arch=sm_20,但我得到了同样的错误。

1 个答案:

答案 0 :(得分:6)

看起来你在printf的格式化程序字符串的两端都有一个奇怪的引号字符。

如果你复制并粘贴这个程序,它应该编译并运行而不会出错:

#include <stdio.h>

__global__ void helloCUDA(float f)
{
  printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}

int main()
{
  helloCUDA<<<1, 5>>>(1.2345f);
  cudaDeviceReset();
  return 0;
}

输出:

$ nvcc -arch=sm_20 test.cu -run
Hello thread 0, f=1.234500
Hello thread 1, f=1.234500
Hello thread 2, f=1.234500
Hello thread 3, f=1.234500
Hello thread 4, f=1.234500

我不明白是否需要开始程序的怪异宏。我会摆脱它。