PCにCUDA 8.0を正常にインストールしました。Ubuntu16.10で次のコマンドを実行すると、そのファイルを表示できます。
$ 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
次に、CUDAがインストールされているかどうかを確認するために、次のソースコード(has_cuda.c)を取得しました。
#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がどこにあるかを示すために変数をエクスポートする必要がありますか?これどうやってするの?
私はcudaプロジェクトを自分でコンパイルしたことはありませんが、ライブラリをコンパイラにリンクする必要があることは確かです。
迅速なグーグルで、Nvidiaはこれをすべて処理するコンパイラーを持っていると言います。だからあなたはそれをインストールするだけでいいのです。それはNVVCと呼ばれています。インストールしたら、次を実行:
nvcc helloworld.cu -o hello.out
詳細はこちらのリンクをご覧ください: www.pdc.kth.se
それは、コンパイラがほとんど常にリンクする必要があるということを知っているからではありません。リンカはそれを見つける場所をすでに知っているので、標準ライブラリに対してそれを行う必要はありません。
このコードのコンパイラとしてgcc
を使用する場合、適切なインクルードヘッダーファイルはcuda.h
ではなくcuda_runtime.h
です。他の回答が指摘するように、nvcc
(マシンにすでにインストールされている)を使用するだけで、このコードにインクルードヘッダーをまったく必要としません。
nvcc
を使用する場合は、適切なPATH
環境変数が設定されていることを確認する必要があります。これと他の有用な情報は linuxインストールガイド に含まれています。
したがって、次のようにコードを変更すると、
#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
シンボリックリンクがマシンに設定されているかどうかはわかりません。また、インクルードディレクトリが通常とは異なる場所にあるように見えます.
/usr/local/cuda-8.0/targets/x86_64-linux/include
しかし、これまでと同じようにfind
を使用できます。
同様に、-L
スイッチの後のパスは、libcudart.soとそのいとこが含まれるcuda lib64
ディレクトリへのパスである必要があります。繰り返しますが、これは通常、私が示したパスでシンボリックリンクされますが、マシンのインストールが私の期待に沿わない場合があります。 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 check を使用し、次のようにcuda-memcheckでコードを実行してください。
cuda-memcheck ./has_cuda
報告されたエラー情報を理解していない場合でも、助けようとする人にとっては役立つかもしれません。