CUDA 8.0とcuDNN 6をUbuntu 16.04LTSにインストールする

# CUDA 8.0のインストール
[NVIDIAの公式ページ](https://developer.nvidia.com/cuda-80-ga2-download-archive)からCUDA 8.0をダウンロードする。
Operating System: Linux, Architecture: x86_64, Distribution: Ubuntu, Version: 16.04, Installer Type: deb (network). ダウンロードしたフォルダで以下のコマンドを実行してCUDAをインストールする。メタパッケージの`cuda-8-0`をインストールすると、全てのCUDA ToolkitとDriverパッケージがインストールされる。（CUDA 9.0のインストール方法は[こちら](https://qiita.com/JeJeNeNo/items/b30597918db3781e20cf)）

```bash:terminal
sudo dpkg -i cuda-repo-ubuntu1604_8.0.*_amd64.deb
sudo apt update
sudo apt install cuda-8-0
```

# パスの設定
以下のechoコマンドかテキストエディタでCUDAのパスを`.bashrc`のファイルの最後に書き込む。その設定をsourceコマンドで読み込む。

```bash:terminal
echo -e "\n## CUDA and cuDNN paths"  >> ~/.bashrc
echo 'export PATH=/usr/local/cuda-8.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
source ~/.bashrc # CUDAのパスが書き込まれた~/.bashrcを読み込む。
```

```bash:.bashrcに追加される文字列

## CUDA and cuDNN paths
export PATH=/usr/local/cuda-8.0/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}
```

CUDAのパスが通っているか確認。

```bash:terminal
echo $PATH             # 出力に"/usr/local/cuda-8.0/bin"が含まれているか？
echo $LD_LIBRARY_PATH  # 出力に"/usr/local/cuda-8.0/lib64"が含まれているか？
which nvcc             # 出力が"/usr/local/cuda-8.0/bin/nvcc"になっているか？
nvidia-smi             # nvidiaのGPUの情報が表示されているか？
```

# cuDNNのインストール
## cuDNN 6のインストール
https://developer.nvidia.com/rdp/cudnn-download からcuDNN 6 for CUDA 8.0のdebパッケージをダウンロードする（アクセスするにはメンバー登録が必要）。具体的には以下の３個のdebパッケージをダウンロードする。

- cuDNN v6.0 Runtime Library for Ubuntu16.04 (Deb)
- cuDNN v6.0 Developer Library for Ubuntu16.04 (Deb)
- cuDNN v6.0 Code Samples and User Guide for Ubuntu16.04 (Deb)

ダウンロードしたフォルダで以下のコマンドを実行して、cuDNNをインストールする。

```bash:terminal
# Install Runtime library
sudo dpkg -i libcudnn6_6.0*+cuda8.0_amd64.deb
# Install developer library
sudo dpkg -i libcudnn6-dev_6.0*+cuda8.0_amd64.deb
# Install code samples and user guide
sudo dpkg -i libcudnn6-doc_6.0*+cuda8.0_amd64.deb
```

### cuDNN 5.1のインストールとアンインストール
cuDNN 6を使う場合はcuDNN 5.1は必要ない。このセクションのインストール方法はcuDNN 6が登場する以前に作られたもの。
https://developer.nvidia.com/rdp/cudnn-download からcuDNN 5.1 for CUDA 8.0をダウンロードする（アクセスするにはメンバー登録が必要）。　ダウンロードしたフォルダで以下のコマンドを実行して、cuDNNのライブラリをCUDAがインストールされているディレクトリにコピーする。シンボリックリンクがシンボリックリンクとしてコピーされるように cp には -a をつける必要がある。

```bash:terminal
tar xzvf cudnn-8.0-linux-x64-v5.1.tgz 
sudo cp -a cuda/lib64/* /usr/local/cuda-8.0/lib64/
sudo cp -a cuda/include/* /usr/local/cuda-8.0/include/
sudo ldconfig
```

cuDNN 6にアップデートする際にはcuDNN 5.1をアンインストールする必要がある。上記の方法でインストールした際には以下の方法でアンインストールできる。

```bash:terminal
cd /usr/local/cuda-8.0/lib64/
sudo rm libcudnn.so  libcudnn.so.5  libcudnn.so.5.1.5  libcudnn_static.a
cd /usr/local/cuda-8.0/include/
sudo rm cudnn.h
sudo ldconfig
```

# 動作確認
CUDAのサンプルコードを実行して動作確認する。
サンプルコードをホームディレクトリにコピーするシェルスクリプト（cuda-install-samples-8.0.sh）は　`/usr/local/cuda-8.0/bin/` にあるので、CUDAのパスが通っていればそのファイル名を指定するだけで実行できる。

```bash:terminal
cuda-install-samples-8.0.sh ~ # ホームディレクトリにサンプルコードをコピー。
cd ~/NVIDIA_CUDA-8.0_Samples/
make
cd bin/x86_64/linux/release   # サンプルの実行ファイルがあるディレクトリに移動。
./smokeParticles
```

![smokeParticles.png](https://qiita-image-store.s3.amazonaws.com/0/134160/a418df1d-2621-c5b3-77b8-2f3572b65b20.png)

# CUDA 8.0の更新
CUDAの新しいバージョンがリリースされた際、以下のような表示がでてアップグレードできなかった。

```bash:terminal
$ sudo apt upgrade 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  cuda cuda-8-0 cuda-drivers cuda-runtime-8-0
0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.

```

これは、古いCUDA関連のパッケージが以前のCUDAパッケージに依存しているために自動でアップデート出来ないようだ。このような時は単純にアップグレードできなかったパッケージを指定してインストールすればいい。どうやら`apt dist-upgrade`は副作用が大きいっぽい。

```bash:terminal
sudo apt install cuda-8-0
sudo reboot
```


# 参考
http://qiita.com/yukoba/items/3692f1cb677b2383c983
http://ry0.github.io/blog/2015/08/12/ubuntu-nvidia-cuda-7.0/
http://askubuntu.com/questions/601/the-following-packages-have-been-kept-back-why-and-how-do-i-solve-it
[CUDA 9.1とcuDNN 7.1をUbuntu 16.04LTSにインストールする](https://qiita.com/JeJeNeNo/items/a56be3be69dc88e6dfa4)
[CUDA 10とcuDNNをUbuntu 18.04LTSにインストールする](https://qiita.com/JeJeNeNo/items/045948694327977f614f)