web-dev-qa-db-ja.com

致命的なエラー:cuda.h:そのようなファイルまたはディレクトリはありません

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がどこにあるかを示すために変数をエクスポートする必要がありますか?これどうやってするの?

6
mad

私はcudaプロジェクトを自分でコンパイルしたことはありませんが、ライブラリをコンパイラにリンクする必要があることは確かです。

迅速なグーグルで、Nvidiaはこれをすべて処理するコンパイラーを持っていると言います。だからあなたはそれをインストールするだけでいいのです。それはNVVCと呼ばれています。インストールしたら、次を実行:

nvcc helloworld.cu -o hello.out

詳細はこちらのリンクをご覧ください: www.pdc.kth.se

それは、コンパイラがほとんど常にリンクする必要があるということを知っているからではありません。リンカはそれを見つける場所をすでに知っているので、標準ライブラリに対してそれを行う必要はありません。

2
Lasse Jacobs

このコードのコンパイラとして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

報告されたエラー情報を理解していない場合でも、助けようとする人にとっては役立つかもしれません。

5
Robert Crovella