2011-08-04 45 views
3

根據CUDA Programming Guide,頁面122,只要我們使用計算體系結構2.x,就可以在設備/全局函數中動態分配內存。在__device/global__ CUDA內核中動態分配內存

我的問題是,當我嘗試此我得到的命令行消息:

命令 「一些命令」 -gencode = ARCH = compute_10,代碼= \ 「sm_10,compute_10 \」 -gencode = ARCH = compute_20,代碼= \「sm_20,compute_20 \」等等

這是緊隨其後的錯誤說,你不能調用從設備/全球功能的主機功能(malloc的)。

上面的消息表明它正試圖在計算1.x下進行編譯。我正在使用VS2010,並且在「CUDA C/C++」屬性頁面中將「代碼生成」設置爲「compute_20,sm_20」,所以我不確定爲什麼它仍然試圖在compute 1.x下編譯。我絕對使用支持2.x的卡。有任何想法嗎?

回答

3

您應該能夠在輸出中看到nvcc命令行。事實上,我認爲你有點粘貼了所有的-gencode/etc。在其中你的命令行。因此,這也證明您正在編譯sm_10和sm_20的代碼,這就是爲什麼當您調用malloc時出現錯誤的原因。

您可以通過將呼叫打包到#if __CUDA_ARCH__ >= 200並確認錯誤消失來確認。

我猜你設置的屬性來編譯在你的項目.CU文件的默認屬性sm_20,但後添加的文件.CU到項目。將文件添加到項目時,默認值可能設置爲sm_10和sm_20(這是.rules文件的默認值)。如果你右鍵點擊文件本身,你可能會看到sm_20被選中。只是一種預感。

+0

你是對的 - 我已經設置了在compute_20,sm_20下編譯的默認屬性。但是當我檢查文件本身的屬性時,它仍然被設置爲compute_20,sm_20和compute_10,sm_10。改變了這一點,現在我的代碼成功編譯了。 – Barjavel