печать из ядер cuda


Я пишу программу cuda и пытаюсь напечатать что-то внутри ядер cuda, используя функцию printf. Но когда я компилирую программу, то получаю ошибку

error : calling a host function("printf") from a __device__/__global__ function("agent_movement_top") is not allowed


 error MSB3721: The command ""C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.2binnvcc.exe" -gencode=arch=compute_10,code="sm_10,compute_10" --use-local-env --cl-version 2008 -ccbin "c:Program Files (x86)Microsoft Visual Studio 9.0VCbin" -I"C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.2Ccommoninc" -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.2include"  -G  --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile  -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MDd  " -o "Debugtest.cu.obj" "C:UsersumduttaDesktopSANKHA_ALL_MATERIALSPROGRAMMING_FOLDERABM_MODELLING_2D_3DTRY_NUM_2test_proj_testtest_projtest_projtest.cu"" exited with code 2.

Я использую карту GTX 560 ti, имеющую вычислительные возможности больше 2.0, и когда я немного поискал о печати из ядер cuda, я также увидел, что мне нужно изменить компилятор с sm_10 на sm_2. 0, чтобы использовать все преимущества карты. Также некоторые предложили для купринта служить цель. Я немного запутался, что мне делать, и что должно быть самым простым и быстрым способом получить распечатки на экране моей консоли. Если мне нужно изменить компилятор nvcc с 1.0 на 2.0, что я должен сделать? Еще одна вещь, которую я хотел бы отметить, что я использую windows 7.0 и программирование в visual studio 2010. Спасибо за вашу помощь.

3 8

3 ответа:

Чтобы включить использование plain printf() на устройствах с вычислительной способностью > = 2.0, важно скомпилировать для CC по крайней мере CC 2.0 и отключить значение по умолчанию, которое включает сборку для CC 1.0.

Щелкните правой кнопкой мыши файл .cu в вашем проекте, выберите Properties, выберите Configuration Properties | CUDA C/C++ | Device. Щелкните на строке Code Generation, щелкните треугольник, выберите Edit. В диалоговом окне генерация кода снимите флажок Inherit from parent or project defaults, введите compute_20,sm_20 в верхнем окне и нажмите кнопку ОК.

Один из способов решения этой проблемы заключается в использовании функции cuPrintf, которая способна печатать из ядер. Скопируйте файлы cuPrintf.cu и cuPrintf.cuh из папки

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\src\simplePrintf

В папку проекта. Затем добавьте файл заголовка cuPrintf.cuh в свой проект и добавьте

#include "cuPrintf.cu"

К вашему коду. Тогда ваш код должен быть написан в формате, указанном ниже:

#include “cuPrintf.cu”
__global__ void testKernel(int val)
{
  cuPrintf(“Value is: %d\n”, val);
}

int main()
{
  cudaPrintfInit();
  testKernel<<< 2, 3 >>>(10);
  cudaPrintfDisplay(stdout, true);
  cudaPrintfEnd();
  return 0;
}

Следуя описанной выше процедуре, можно получить печать на окне консоли из функции устройства. Хотя я решил свою проблему. проблемы вышеописанным способом у меня до сих пор нет решения с помощью функции printf от устройства. Если это правда и абсолютно необходимо обновить мой компилятор nvcc с sm_10 до sm_21, чтобы включить функцию printf, то было бы очень полезно, если бы кто-то мог показать мне свет. Спасибо за ваше сотрудничество

Вы можете написать этот код для печати всего, что вы хотите, из ядра CUDA:

# if __CUDA_ARCH__>=200
    printf("%d \n", tid);

#endif  

И включить