CUDA 8.0 RCをUbuntu 16.04 LTS + GTX1080にインストール

Ubuntu 16.04 LTS + GeForce GTX 1080の環境に、CUDA 8.0 RCをインストールします。Ubuntu 16.04 LTSでは、デフォルトでgcc 5.4のため、CUDA toolkitのインストール時に適切なコンパイラが無いと怒られます。2016年8月8日にgcc 5.4に対応した公式パッチが出たのですが、これに対するドキュメントが見当たらないため、メモ代わりに残しておきます。（gccを5.3.1にダウングレードすれば、パッチを使用せずにインストールできると思います。）

# 公式ドキュメントを見る
まずは、公式ドキュメントである[Installation Guide for Linux](https://developer.nvidia.com/compute/cuda/8.0/rc/docs/sidebar/CUDA_Installation_Guide_Linux-pdf)を確認します。以下の手順は基本的に公式ドキュメントのPackage Manager Installationをベースにインストールを試みます。

# CUDA 8.0 RCをダウンロードする
[CUDAのダウンロードサイト](https://developer.nvidia.com/cuda-release-candidate-download)に行って、インストーラをダウンロードします。ダウンロードサイトへのアクセス時にはNvidiaメンバーでのログインが求められますので、アカウントを持っていない場合は作成する必要があります。
今回はPackage Manager Installationを利用するため、debをダウンロードします。以下の、「Base Installer」「Patch 1」の両方をダウンロードして、この後のインストール作業を簡単にするため、Homeフォルダに移動しておきます。
![cuda.png](https://qiita-image-store.s3.amazonaws.com/0/132194/6dbf3fce-f544-a02a-0c0a-604e841120cf.png)

# 事前確認
### CUDA対応のGPUがハードウェア認識されているか確認
ターミナルで以下のコマンドを入力して、GPUが認識されているか確認します。

```bash
$ lspci | grep -i nvidia
```

認識されていない場合は、PCIスロットにハードウェアがきちんとささっていることを確認した上で、`update-pciids`コマンドを入力するなどして、認識させてください。
### gccのバージョンを確認する
CUDA Toolkitをコンパイルするためにgccが必要になります。gccのバージョンを確認して下さい。Ubuntu 16.04 LTSを最新状態にしている場合は、gcc 5.4となっているはずです。

```bash
$ gcc --version
```

### 適切なKernel HeadersとDevelopment Packagesがインストールされていることを確認
現在のカーネルのバージョンを確認するには、以下のコマンドを入力します。

```bash
$ uname -r
```
現在のカーネルに合わせてKernel HeadersとDevelopmemt Packagesをインストールするには以下のコマンドを入力します。

```bash
$ sudo apt-get install linux-headers-$(uname -r)
```
# 競合するインストールの削除
過去のバージョンのCUDA Toolkitがrunfileでインストールされている場合、以下のコマンドで削除します。

```bash
$ sudo /usr/local/cuda-X.Y/bin/uninstall_cuda_X.Y.pl
```
また、CUDA Driverがrunfileでインストールされている場合、以下のコマンドで削除します。

```bash
$ sudo /usr/bin/nvidia-uninstall
```

RPM/DebでNvidiaのドライバなどがインストールされている場合は、以下のコマンドで削除します。

```bash
$ sudo apt-get --purge remove nvidia-*
```

# CUDAのインストール
以下のコマンドでCUDAをインストールします。

```bash
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-rc_8.0.27-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
$ sudo apt-get remove --purge -y cuda-repo-ubuntu1604-8-0-rc
```

パッチを当てます。

```bash
$ sudo dpkg -i cuda-misc-headers-8-0_8.0.27.1-1_amd64.deb
```

# インストール後の作業
### 環境変数の設定
~/.bashrcに以下の変数を追加してください。

```
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda
```

ここで再起動しましょう。再起動後に動作が不安定の場合は、`Ctrl + Alt + F1`を押して仮想コンソールを起動し、Nvidiaのドライバを再インストールします。

```bash
$ sudo apt-get install nvidia-367 --reinstall
$ sudo reboot
```

# 正常にインストールできたか確認する
### ドライバのバージョンを確認する

```bash
$ cat /proc/driver/nvidia/version
```

### nvccのバージョンを確認する

```bash
$ nvcc -V
```

### 書き込み可能なサンプルをインストールする
いくつかサンプルを動かす必要があるため、サンプルをインストールします。

```bash
$ cd /usr/local/cuda-8.0/samples
$ sudo make
```

deviceQueryを実行してみましょう。Result=PASSであれば動いているはずです。

```bash
$ cd bin/x86_64/linux/release
$ sudo ./deviceQuery
```

![deviceQuery.png](https://qiita-image-store.s3.amazonaws.com/0/132194/49339340-f251-ad65-fb88-f676b6d56b39.png)


もう一つ、bandwidthTestを実行します。

```bash
sudo ./bandwidthTest
```
![bandwidthTest.png](https://qiita-image-store.s3.amazonaws.com/0/132194/8f361592-5ee2-6987-0db6-8497489a09b1.png)

# ついでにcuDNNをインストール
Deep Learningの環境を整える場合は、cuDNNが必要になります。
[cuDNNのダウンロードサイト](https://developer.nvidia.com/rdp/cudnn-download)でログインしたあと、「cuDNN v5.1 Library for Linux」をダウンロードします。

![cudnn.png](https://qiita-image-store.s3.amazonaws.com/0/132194/f092df88-d27a-84fe-5951-aed338c063ce.png)

ダウンロードしてきたファイルを解答して所定の場所に配置すれば完了です。
（パスは上記のCUDAのインストール時に設定しています）

```bash
tar -zxf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp lib64/libcudnn* /usr/local/cuda-8.0/lib64/
sudo cp include/cudnn.h /usr/local/cuda-8.0/include
```