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