2016-12-23 290 views
1

我在我的電腦成功安裝CUDA 8.0,我可以在我的Ubuntu 16.10運行以下命令來查看其中的文件:致命錯誤:cuda.h:沒有這樣的文件或目錄

$ sudo find/-name nvcc 

/usr/local/cuda-8.0/bin/nvcc 

$ sudo find/-name cuda 

/usr/local/cuda 
/usr/local/cuda-8.0/targets/x86_64-linux/include/thrust/system/cuda 
/usr/share/doc/cuda 
/usr/include/nvidia-367/cuda 

然後,我得到了下面的源代碼(has_cuda.c)檢查是否已安裝CUDA:

#include<cuda.h> 

int main() 
{ 
    int deviceCount; 
    cudaError_t e = cudaGetDeviceCount(&deviceCount); 
    return e == cudaSuccess ? deviceCount : -1; 
} 

但運行此代碼返回我下面的錯誤:

$ gcc has_cuda.c 

has_cuda.c:1:17: fatal error: cuda.h: No such file or directory 
#include<cuda.h> 
      ^
compilation terminated. 

我找cuda.h在我的目錄,發現他們在以下地點:

$ sudo find/-name cuda.h 

/usr/local/cuda-8.0/targets/x86_64-linux/include/cuda.h 
/usr/include/nvidia-367/cuda/cuda.h 
/usr/include/linux/cuda.h 
/usr/src/linux-headers-4.8.0-22/include/linux/cuda.h 
/usr/src/linux-headers-4.8.0-22/include/uapi/linux/cuda.h 
/usr/src/linux-headers-4.8.0-32/include/linux/cuda.h 
/usr/src/linux-headers-4.8.0-32/include/uapi/linux/cuda.h 

我很菜鳥就這一點,所以,有什麼可怎麼回事?我是否應該輸出任何變量來指出cuda.h的位置?我怎樣才能做到這一點?

回答

2

我從來沒有編譯過cuda項目,但我可以肯定地告訴你,你需要將庫鏈接到編譯器。

一些快速谷歌搜索說,Nvidia編譯器爲此將處理一切。所以你只需要安裝它,你應該很好去。它被稱爲NVVC。一旦安裝只需運行:

nvcc helloworld.cu -o hello.out 

這裏是說明了它更多的鏈接: www.pdc.kth.se

這不是因爲你知道什麼是編譯器,你幾乎總是需要聯繫起來。你不必爲標準庫做,因爲鏈接器已經知道在哪裏找到它。

+0

似乎值得強調的是這個答案最相關的一點是要重命名的源文件有'.cu'擴展,指示'nvcc'把它當作CUDA代碼。這將鏈接到相關的庫中,但它也將包括必要的頭文件,使頂層冗餘的'#include '(最好,詳見Robert Crovella的答案)。 – tera

4

適當的包含頭文件不是cuda.h而是cuda_runtime.h,假設您想使用gcc作爲此代碼的編譯器。正如其他答案指出的那樣,您可以僅使用nvcc(已安裝在您的機器上),它根本不需要任何包含此代碼的頭文件。

如果你想使用nvcc你可能應該確保設置了適當的PATH環境變量。這個和其他有用的信息包含在linux install guide中。

因此,如果您修改代碼:

#include <cuda_runtime.h> 

int main() 
{ 
    int deviceCount; 
    cudaError_t e = cudaGetDeviceCount(&deviceCount); 
    return e == cudaSuccess ? deviceCount : -1; 
} 

你應該能夠編譯它成功地使用命令是這樣的:

gcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 has_cuda.c -lcudart -o has_cuda 

-I切換後的路徑應該包含您機器上的路徑爲cuda_runtime.h。通常情況下,將被設置爲以上,但我不知道,如果cuda符號鏈接設置你的機器上,也它看起來像你的include目錄可能是在不尋常的地方,即

/usr/local/cuda-8.0/targets/x86_64-linux/include 

但您可以使用find,就像您一直在尋找它一樣。

同樣,-L開關之後的路徑必須是您的cuda lib64目錄的路徑,該目錄將包含libcudart.so和其堂兄弟。同樣,這通常會在我顯示的路徑上進行符號鏈接,但是您的機器安裝可能不符合我的期望。您應該能夠使用find來找到正確的路徑。

而且在對方的回答表明,如果使用nvcc(你已經位於),您將不再需要明確地選擇-I-L路徑。最簡單的方法,使這項工作是從has_cuda.c您的文件重命名爲has_cuda.cu,那麼你應該能夠這樣進行編譯:

nvcc has_cuda.cu -o has_cuda 

最後的Ubuntu 16.10是不是CUDA此時正式支持的分佈,所以可能會有一些意外的事情發生在你的機器上。我建議您閱讀先前鏈接的安裝指南,因爲它包含有關安裝後設置步驟的有用信息,例如設置環境變量以及如何「驗證」CUDA安裝。

任何時候你正在運行CUDA代碼,且具有更大的麻煩,請務必使用proper cuda error checking與CUDA的MEMCHECK運行你的代碼,就像這樣:

cuda-memcheck ./has_cuda 

即使你不懂報告的錯誤信息,對那些試圖幫助你的人可能會有用。

+0

雖然我可以找到nvcc每次使用它我有以下錯誤: $ nvcc has_cuda.c 程序'nvcc'目前尚未安裝。您可以通過鍵入以下內容進行安裝: sudo apt install nvidia-cuda-toolkit。 – mad

+0

cuda-memcheck有類似的錯誤:cuda-memcheck ./has_cuda 程序'cuda-memcheck'目前沒有安裝。您可以通過鍵入以下命令來安裝它: sudo apt install nvidia-cuda-toolkit – mad

+0

您需要將CUDA bin目錄添加到PATH環境變量中。這些說明包含在我鏈接的安裝指南中。 –

相關問題