Использование printf () в Cuda 4.0 Ошибка компиляции - PullRequest
3 голосов
/ 04 ноября 2011

У меня GTX 570 (архитектура Fermi) с вычислительной способностью 2.0. У меня на компьютере установлена ​​версия Cuda 4.0 и я использую Ubuntu 10.10

С Cuda 4.0 можно использовать printf() внутри ядер. Вот пример кода со страницы 125 руководства по программированию Cuda 4.0

#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 Ответ

6 голосов
/ 04 ноября 2011

Похоже, у вас есть странный символ кавычки в конце строки форматирования 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

Я не понимаю необходимости в странном макросе, который запускает программу.Я бы избавился от этого.

...