我正在編寫一個cuda程序,並嘗試使用printf函數在cuda內核中打印某些內容。但是,當我在編譯程序,然後我得到從cuda內核打印
error : calling a host function("printf") from a __device__/__global__ function("agent_movement_top") is not allowed
error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.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.0\VC\bin" -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include" -G --keep-dir "Debug" -maxrregcount=0 --machine 32 --compile -g -Xcompiler "/EHsc /nologo /Od /Zi /MDd " -o "Debug\test.cu.obj" "C:\Users\umdutta\Desktop\SANKHA_ALL_MATERIALS\PROGRAMMING_FOLDER\ABM_MODELLING_2D_3D\TRY_NUM_2\test_proj_test\test_proj\test_proj\test.cu"" exited with code 2.
我使用具有計算能力大於2.0和卡GTX 560 TI一個錯誤,當我已經搜索了一下有關從CUDA內核我也印刷看到我需要將編譯器從sm_10更改爲sm_2.0以充分利用該卡。還有一些建議cuPrintf來達到這個目的。我有點困惑,我應該怎麼做,以及什麼應該是最簡單最快捷的方式來獲取我的控制檯屏幕上的打印輸出。如果我需要將nvcc編譯器從1.0更改爲2.0,那麼我該怎麼做?還有一件事我想提一下,我正在Visual Studio 2010中使用Windows 7.0和編程。感謝您的幫助。
如果(1)你編譯sm_21目標架構它應該工作和(2)確保'#include stdio.h'。 CUDA運行時包含內核的printf設備重載,但必須明確包含C stardard I/O庫才能使此機制起作用。 – talonmies
嗨! 標準I/O頭文件始終包含在內,我的卡的計算能力爲2.1。所以我認爲應該使用nvcc編譯器的sm_21特性進行編譯。不過,我通過使用cuPrintf函數解決了我的問題。但我仍然想知道如何將默認的nvcc 1.0計算能力更改爲2.1計算能力。 – duttasankha
@RogerDahl:那很完美,而且工作得很好。你能否只是發佈你的答案,以便我可以接受它。你讓我今天一整天都感覺很好。萬分感謝。 – duttasankha