2011-11-11 36 views
1

我試圖編譯具有內核 內的malloc函數代碼和我得到這個錯誤:malloc的內部核心

Error 5 error : calling a host function("malloc") from a __device__/__global__ function("bitapS") is not allowed C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\str_bit\main.cu 36 1 str_bit 

我的命令行是:

Error 6 error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2010 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64" -I"../../common/inc" -I"../../../shared/inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include" -G0 --keep-dir "x64\Debug" -maxrregcount=0 --machine 64 --compile -D_NEXUS_DEBUG -g -Xcompiler "/EHsc /nologo /Od /Zi /MTd " -o "x64/Debug/main.cu.obj" "C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\str_bit\main.cu"" exited with code 2. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 4.0.targets 357 10 str_bit 

有什麼建議?我認爲,與sm_20啓用您可以分配...我的卡是460 GTX 謝謝!

+0

我看到-gencode = ARCH = compute_10,代碼中的潛在問題= \ 「sm_10,compute_10 \」 的聲明,你確定它不會優先考慮? – Erbureth

+0

有了'''-gencode''','''nvcc'''編譯代碼*所有*所提供的架構,並創建了一個「胖二進制」。所以當它爲'''sm_10'''編譯包含'''malloc''的代碼時發生錯誤。 –

回答

1

我發現它.... 您必須指定 sm_20,compute_20 也給你的文件屬性,不僅在項目屬性!

還是要謝謝你!

-3

你不應該分配的內核內存裏。永遠。這是CUDA內核設計不佳並且性能不佳的明顯標誌。

+0

你可以!閱讀規格! 您必須指定 sm_20,compute_20 也給您的文件! 還是謝謝! –

+0

@iassael也許你可以,但我仍然認爲它是一個糟糕的主意表現明智。由於所有對內核的輸入必須來自主機(或者是靜態的),因此您可以在主機端執行所有計算以分配適量的內存。 – onit

+3

@iassael:onit是正確的和不正確的:他說不能在計算能力2.0的設備上運行時在內核中動態地分配內存;他說的確如此,如果你關心性能,你確實不應該這樣做,這看起來像是一個合理的假設,因爲你首先使用CUDA和GPU。 – Patrick87

3

這是真的,你不應該這樣做,但如果啓用它們,它可能有一定的用途。 由於您正在編譯體系結構1.0和2.0,因此代碼會顯示錯誤。爲了讓編譯,你可以在命令行刪除

-gencode=arch=compute_10,code=\"sm_10,compute_10\" 

,如果你只打算運行費米器件代碼或必須爲舊設備提供源代碼的替代代碼。

__CUDA_ARCH__ 

這樣的:您可以通過使用NVCC預處理宏做

#if (__CUDA_ARCH__ < 200) 
/* code for 1.x arch */ 
#else 
/* code for 2.x arch */ 
#endif 

看來你使用Visual Studio所以在項目屬性,你可以去CUDA部分,並指定有你不想爲之建造的架構。