2012-12-31 117 views
6

我正在編寫一個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和編程。感謝您的幫助。

+0

如果(1)你編譯sm_21目標架構它應該工作和(2)確保'#include stdio.h'。 CUDA運行時包含內核的printf設備重載,但必須明確包含C stardard I/O庫才能使此機制起作用。 – talonmies

+0

嗨! 標準I/O頭文件始終包含在內,我的卡的計算能力爲2.1。所以我認爲應該使用nvcc編譯器的sm_21特性進行編譯。不過,我通過使用cuPrintf函數解決了我的問題。但我仍然想知道如何將默認的nvcc 1.0計算能力更改爲2.1計算能力。 – duttasankha

+0

@RogerDahl:那很完美,而且工作得很好。你能否只是發佈你的答案,以便我可以接受它。你讓我今天一整天都感覺很好。萬分感謝。 – duttasankha

回答

8

要在Compute Capability> = 2.0的設備上使用普通printf(),編譯至少CC 2.0的CC至關重要,並禁用默認設置(包括CC 1.0的構建)。

用鼠標右鍵單擊項目中的.cu文件,選擇Properties,選擇Configuration Properties | CUDA C/C++ | Device。點擊Code Generation一行,點擊三角形,選擇Edit。在代碼生成對話框中,取消選中Inherit from parent or project defaults,在頂部窗口中鍵入compute_20,sm_20,單擊確定。

+0

不工作。仍然抱怨printf未定義。我的是CUDA 6.5 + VS2012 + Tesla2050 – Ono

6

解決此問題的一種方法是使用能夠從內核打印的cuPrintf函數。 cuPrintf.cucuPrintf.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功能,那麼如果有人能夠向我展示燈光,它將非常有幫助。感謝您的全力配合

3

你可以這樣寫代碼打印不管你從CUDA內核裏面想:

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

#endif 

,包括< stdio.h>中