печать из ядер 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 ответа:
Чтобы включить использование 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
, то было бы очень полезно, если бы кто-то мог показать мне свет. Спасибо за ваше сотрудничество