CUDA™ 9.0 開発環境をインストールする (Linux版)

対象 GPU CUDA 9.0 インストール CentOS / Red Hat EL 7

 PGIアクセラレータ™ コンパイラを使用する前に、NVIDIA社の CUDA™ 開発環境をインストールしておく必要があります。ここでは、 一例として CentOS 7.2 (RHEL 7.2) 上に CUDA 9.0 環境をインストールする手順を説明します。ここでの前提は、ハードウェアシステムの中に、NVIDIA 社の GPU が実装されていることとします。
2017年11月27日 Copyright © 株式会社ソフテック 加藤

必要とするハードウェア、ソフトウェア環境

 PGIアクセラレータ™ コンパイラを使用するためには、NVIDIA社の CUDA-enable な GeForce、Quadro、Tesla カードを有した CUDA ソフトウェアがインストールされたシステムが必要です。サポートされる GPU の詳細なリストは、NVIDIA の ウェブサイトでご覧下さい。https://developer.nvidia.com/cuda-gpus
なお、現在、Linuxシステム(Red Hat/ CentOS /Fedora) に搭載している GPU ボードの型番を調べたい場合は、以下のコマンドを使用します。以下の例は、NVIDIA Tesla K20(NF200) と GeForce 580(GF110) ボードが搭載された場合の状況を示しています。また、OS名、GCCバージョンを確認します。

[root@photon29 ~]# lspci | grep -i nVidia
(一例)
02:00.0 PCI bridge: NVIDIA Corporation NF200 PCIe 2.0 switch (rev a3)
03:00.0 PCI bridge: NVIDIA Corporation NF200 PCIe 2.0 switch (rev a3)
03:02.0 PCI bridge: NVIDIA Corporation NF200 PCIe 2.0 switch (rev a3)
04:00.0 VGA compatible controller: NVIDIA Corporation GF110 [GeForce GTX 580] (rev a1)
04:00.1 Audio device: NVIDIA Corporation GF110 High Definition Audio Controller (rev a1)
06:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)

[root@photon29 ~]# uname -m && cat /etc/*release
x86_64
CentOS Linux release 7.2.1511 (Core)

[root@photon29 ~]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

[root@photon29 ]# uname -r  (Linuxカーネルヘッダー名の確認)
3.10.0-327.36.2.el7.x86_64

 また、Linuxシステム上でNVIDIA CUDAドライバーコンポーネントをインストールしておく必要があります。 これらは、NVIDIA の Webサイト( https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64) からダウンロード可能です。

 CUDA 6.0 バージョンから Linux の RPM (Package Manager) によるインストールが可能となりました。今回は、この方法で CUDA をインストールする方法を説明します。(従来の Runfile によるインストール方法もあります。Runfile による方法は、過去の CUDA 5.0 インストール方法をご参照ください。)上記の CUDA 9.0 ダウンロードサイトのページから CentOS 7 の distribution用の RPM 用のファイルをダウンロードします。CUDA 7.0 から、ネットワーク・インストール用の rpm ファイルとローカル・インストール用の rpm パッケージの二種類が提供されています。前者のファイル名はrpm -i cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm で、後者の場合は cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm と言うファイルです。また、前者のファイルは CUDA 用のリポジトリを RPM 管理下にセットするためのファイルです。後者のローカルパッケージ用の rpm ファイルをインストールすると、 CUDA 用のリポジトリのセットと /var 配下に CUDA 9.0 の実体 rpm ファイルが作成されます。
 ネットワーク・インストールは手軽ですが、途中、ネットワーク回線の混雑の影響でインストールが失敗する場合が多々あります。基本的には、ローカル・インストール用(約 1.6GB)のファイルをダウンロードし、rpm でのインストールを行った方が安全です。なお、ローカル・インストール用パッケージをダウンロードした後、ファイルのチェックサムを確認して下さい。以下では、ローカル・インストール用パッケージを利用した例を説明します。

$ cd /tmp

$ wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/
cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm

NVIDIA 英文インストレーション・ガイドは、こちらで見ることが出来ますので、併せて参照してください。

CUDA ソフトウェアのインストール

事前準備

Linux Kernel header and development package の確認と実装

CUDA drivers をインストールする際、Linux kernel headersを必要としますので、Linux カーネル・ヘッダ等のソースが必要となります。/usr/src/kernels 配下に uname -r で出力されるカーネルバージョンが存在するか確認して下さい。もし、実装されていない場合は、以下のコマンドでインストールして下さい。

# sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

Red Hat 上でインストールする際の注意

RedHat 系の場合、DKMS / libvdpau のような他の外部パッケージに依存するため、EPEL 等のサードパーティのリポジトリのセットが必要となります(以下は CentOS/RHEL 7 の場合)。以下のコマンドにより、EPEL のためのセットアップを行います。yum を用いてリポジトリのセットを行います。すでに、リポジトリがセットされている場合は、実施する必要はありません。このページも参考になります

# yum install epel-release
インストール:
  epel-release.noarch 0:7-6
完了しました!

# yum search libvdpau (libvdpau が実装されているかを確認、なければinstallする)

# yum update

 CUDAドライバーは、基本的には、X display のドライバでもありますので、これをインストールする時は、X が動作していない状態で行う必要があります。Linux システムの起動では、デフォルト Run level 5 で起動されますので、X が動作しています。これを一旦、Run level 3 に戻してから CUDA のドライバのインストールを行いますが、その前に、RPMによるインストール方法と従来の NVIDIA Runfile でインストールする方法では、互換性がないため過去の NVIDIA ドライバーを削除します(新規インストールの場合は必要ありません)。

[root@photon30 ~]# init 3

[root@photon30 tmp]# uname -a   (Linux カーネ情報)
Linux photon29 3.10.0-327.36.2.el7.x86_64 #1 SMP Mon Oct 10 23:08:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

(以前に .run ファイルで実装されたCUDAドライバーを削除する。存在しなければ、
  コマンドがないと言うメッセージが出る。)
[root@photon30 tmp]# /usr/bin/nvidia-uninstall
 

 CUDAのドライバーは Display ドライバーでもあり、インストール時に X11 の設定ファイルを変更する場合があります(過去の CUDA バージョンのインストールでは、リブート後に display driver が起動しないことがありました)。念のため、/etc/X11/xorg.conf ファイルとxorg.conf.dディレクトリ配下のファイルを別場所にバックアップしておくことをお勧めします。(CUDA 9.0 の実装後は、こうした問題はなく正常に display が起動しました。)

CUDA 9.0 の RPM によるインストール

 今回は、CentOS 7.2 にインストールするため、CUDA ダウンロードサイトにて CentOS 7 (64bit) 用の rpm ファイル(ローカルパッケージ)をダウンロードします。なお、ネットワーク・インストールで実施する場合は、インストールyum の実行中、cuda の実体ファイルのダウンロードが正常にできない状況や yum 自体のエラー等が起こることがあります。こうした場合は、何回か繰り返して、yum install cuda コマンドの実行を行うことをお勧めします。ダウンロードできなかったファイルのみがリトライするような状況になります。以下の説明は、ローカルパッケージを使用した場合のインストール例です。

  • cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm

TIPS
 以下の RPM ベースのインストールにおいて、過去の CUDA バージョンの実装ファイルと「依存性があるため、インストールができない」という形で終わることがあります。筆者の場合は、CUDA 8.0 の CUDA が実装されていたため、CUDA 9.0 がインストールできない状況に陥りました。その際の対処として、過去の CUDA version の rpm パッケージを yum で全て削除してから CUDA 9.0 を実装しました。過去の CUDA rpm パッケージを削除する方法は、以下のコマンドで可能です(なお、削除することに関して十分に注意をしてから行って下さい)。

実装されている cudaパッケージの詳細リストを出す。
[root@photon29 tmp]# yum list cuda\*

yum で cuda のパッケージを全部削除する。

[root@photon29 tmp]# yum remove cuda-\*	

CUDA 9.0 の実際のインストール

[root@photon30 tmp]# ls            (/tmp配下で行う)
cuda-repo-rhel7-8-0-local-9.0.44-1.x86_64.rpm

(CUDAリポジトリのインストールと CUDA 9.0 実体ファイル rpm の実装)
[root@photon30 tmp]# rpm --install cuda-repo-rhel7-8-0-local-9.0.44-1.x86_64.rpm 

(yum のリポジトリ確認、cuda-9-0-local.repoが作成されている)
[root@photon30 tmp]# ls /etc/yum.repos.d/
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Sources.repo  CentOS-fasttrack.repo
CentOS-CR.repo    CentOS-Media.repo      CentOS-Vault.repo    cuda-9-0-local.repo
[root@photon30 tmp]# yum clean expire-cache

[root@photon30 tmp]# yum install cuda
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: epel.excellmedia.net
 * extras: centos.usonyx.net
 * updates: centos.usonyx.net

 (略)

インストール:
  cuda.x86_64 0:9.0.176-1                                  xorg-x11-drv-nvidia.x86_64 1:384.81-1.el7

依存性関連をインストールしました:
  cuda-9-0.x86_64 0:9.0.176-1              cuda-command-line-tools-9-0.x86_64 0:9.0.176-1 cuda-core-9-0.x86_64 0:9.0.176-1
  cuda-cublas-9-0.x86_64 0:9.0.176-1       cuda-cublas-dev-9-0.x86_64 0:9.0.176-1         cuda-cudart-9-0.x86_64 0:9.0.176-1
  cuda-cudart-dev-9-0.x86_64 0:9.0.176-1   cuda-cufft-9-0.x86_64 0:9.0.176-1              cuda-cufft-dev-9-0.x86_64 0:9.0.176-1
  cuda-curand-9-0.x86_64 0:9.0.176-1       cuda-curand-dev-9-0.x86_64 0:9.0.176-1         cuda-cusolver-9-0.x86_64 0:9.0.176-1
  cuda-cusolver-dev-9-0.x86_64 0:9.0.176-1 cuda-cusparse-9-0.x86_64 0:9.0.176-1           cuda-cusparse-dev-9-0.x86_64 0:9.0.176-1
  cuda-demo-suite-9-0.x86_64 0:9.0.176-1   cuda-documentation-9-0.x86_64 0:9.0.176-1      cuda-driver-dev-9-0.x86_64 0:9.0.176-1
  cuda-drivers.x86_64 0:384.81-1           cuda-libraries-9-0.x86_64 0:9.0.176-1          cuda-libraries-dev-9-0.x86_64 0:9.0.176-1
  cuda-license-9-0.x86_64 0:9.0.176-1      cuda-misc-headers-9-0.x86_64 0:9.0.176-1       cuda-npp-9-0.x86_64 0:9.0.176-1
  cuda-npp-dev-9-0.x86_64 0:9.0.176-1      cuda-nvgraph-9-0.x86_64 0:9.0.176-1            cuda-nvgraph-dev-9-0.x86_64 0:9.0.176-1
  cuda-nvml-dev-9-0.x86_64 0:9.0.176-1     cuda-nvrtc-9-0.x86_64 0:9.0.176-1              cuda-nvrtc-dev-9-0.x86_64 0:9.0.176-1
  cuda-runtime-9-0.x86_64 0:9.0.176-1      cuda-samples-9-0.x86_64 0:9.0.176-1            cuda-toolkit-9-0.x86_64 0:9.0.176-1
  cuda-visual-tools-9-0.x86_64 0:9.0.176-1

完了しました!

この後、全てをシステムに反映させるためにリブートしてください。

TIPS
 上記の CUDA 9.0 の設定後、システムをリブートすると、デスクトップ環境が立ち上がらない現象が起こる場合があります。この場合は、システムの起動処理が止まった状態になっているため、Ctrl+Alt+F2 ボタンを押して、コマンドモードに移行させます。私のシステムでは、以下のことを実施した後、リブートしたらデスクトップ環境が復活しました。

 /etc/modprobe.d/blacklist-nouveau.conf ファイルを作成します。
もしくはすでに存在している場合、以下の行があるか確認します。

blacklist nouveau
options nouveau modeset=0

次に、カーネルinitramfsファイルを再生成します。

$ sudo dracut --force

その後、リブートします。

この方法でもデスクトップ環境が立ち上がらない場合があります。例えば、システムに実装されているNVIDIA GPU ボードが複数枚あり、一方はグラフィックス用途でも使える geforce ボードで、他方は計算用途のみ tesla GPU といった組合せにおいては、CUDAドライバーのバージョンアップをする度に、リブートするとデスクトップ環境が立ち上がらない現象が起こります。CUDAソフトウェアインストールの際に、グラフィックス用途のためのドライバー機能が優先されないで X11 コンフィグレーションが行われるからと思われます。こうした場合は、一度、直近にインストールした cuda 用の graphic driver のみを「nvidia-uninstallコマンド」で削除して、ディスプレイ用として使う geforce の NVIDIA graphics ドライバー(例えば、NVIDIA-Linux-x86_64-384.98.runといった run ファイル)を実装することを行なってください。何回か、試行錯誤が必要かもしれません。(CUDA 9.0 のライブラリ本体、サンプル等のファイルは削除しない状態で行うことが出来ます)以下は、外部サイトの記事ですが、参考となるページです。

CUDAインストール後の Linux 設定

環境変数 PATH と LD_LIBRARY_PATH

 この環境変数の設定は、PGIコンパイラを使用するだけであるのであれば、必須ではありません。CUDA ToolKit 内の cudaprof 等の utility を使用する場合や、NVIDIA CUDA C言語を使用する場合は必要ですので、予め設定しておいた方が無難でしょう。CUDAソフトウェアの置かれている場所とCUDA shared library の場所を指定するため、以下の環境変数の設定を $HOME/.bashrc 等の起動 rc ファイルに定義します。ここでは、個々のユーザ id 環境下の .bashrc に設定することにします。64ビットの Linux の場合は、LD_LIBRARY_PATHは、/usr/local/cuda-9.0/lib64 を指定します

 【64ビットLinux】LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH

[kato@photon29 tmp]# cd 
[kato@photon29 etc]# vi .bashrc
(前略)
export PATH=/usr/local/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:/lib:$LD_LIBRARY_PATH
:wq
[root@photon29 etc]# 

CUDAコマンドの実行検証

 設定した PATH 環境変数等が反映された別の端末セッションを開き、CUDAコマンドを実行してみます。

[kato@photon29 ~]$ which nvcc
/usr/local/cuda-9.0/bin/nvcc

(テストプログラム作成)
[kato@photon29 ~]$ vi hello.c
main()
{printf("hello\n");}
:wq

[kato@photon29 ~]$ nvcc -V (nvcc コンパイラのバージョン確認)
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

[kato@photon29 ~]$  nvcc hello.c
 
[kato@photon29 ~]$ ./a.out
 HELLO
[kato@photon29 ~]$ ldd a.out (shared library のリンク確認)
        linux-vdso.so.1 =>  (0x00007ffdd6e8c000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fa7546ba000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa75449d000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa754299000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fa753f91000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fa753c8e000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa753a78000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa7536b6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa7548ec000)

 以上で、CUDA の開発環境のセットアップは終了します。

PGIコンパイラの pgaccelinfo コマンドでGPUボード情報を出力

 PGIコンパイラが既にインストールされている場合は、pgaccelinfo コマンドで、実装されているNVIDIA GPUボード情報が出力できます。もし、GPUのボード特性が表示されない場合は、こちらの FAQ をご参照下さい。Linux 上で、CUDA module のロードが行われておらず、/dev 上の nvidia エントリが作成されていない可能性があります。

Linux上の NVIDIA ドライバーバージョンを見る。
[kato@photon29 X11]$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  384.98  Thu Oct 26 15:16:01 PDT 2017
GCC version:  gcc バージョン 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
[kato@photon29 GPGPU]$ pgaccelinfo
CUDA Driver Version:           9000  <== この番号は、NVIDIAドライバーのバージョン番号 9.0 の意味
NVRM version:                  NVIDIA UNIX x86_64 Kernel Module  384.98  Thu Oct 26 15:16:01 PDT 2017

Device Number:                 0
Device Name:                   Tesla K20c
Device Revision Number:        3.5
Global Memory Size:            4972937216
Number of Multiprocessors:     13
Number of SP Cores:            2496
Number of DP Cores:            832
Concurrent Copy and Execution: Yes
Total Constant Memory:         65536
Total Shared Memory per Block: 49152
Registers per Block:           65536
Warp Size:                     32
Maximum Threads per Block:     1024
Maximum Block Dimensions:      1024, 1024, 64
Maximum Grid Dimensions:       2147483647 x 65535 x 65535
Maximum Memory Pitch:          2147483647B
Texture Alignment:             512B
Clock Rate:                    705 MHz
Execution Timeout:             No
Integrated Device:             No
Can Map Host Memory:           Yes
Compute Mode:                  default
Concurrent Kernels:            Yes
ECC Enabled:                   Yes
Memory Clock Rate:             2600 MHz
Memory Bus Width:              320 bits
L2 Cache Size:                 1310720 bytes
Max Threads Per SMP:           2048
Async Engines:                 2
Unified Addressing:            Yes
Managed Memory:                Yes
PGI Compiler Option:           -ta=tesla:cc35

Device Number:                 1
Device Name:                   GeForce GTX 580
Device Revision Number:        2.0
Global Memory Size:            1545469952
Number of Multiprocessors:     16
Number of Cores:               512
Concurrent Copy and Execution: Yes
Total Constant Memory:         65536
Total Shared Memory per Block: 49152
Registers per Block:           32768
Warp Size:                     32
Maximum Threads per Block:     1024
Maximum Block Dimensions:      1024, 1024, 64
Maximum Grid Dimensions:       65535 x 65535 x 65535
Maximum Memory Pitch:          2147483647B
Texture Alignment:             512B
Clock Rate:                    1544 MHz
Execution Timeout:             Yes
Integrated Device:             No
Can Map Host Memory:           Yes
Compute Mode:                  default
Concurrent Kernels:            Yes
ECC Enabled:                   No
Memory Clock Rate:             2004 MHz
Memory Bus Width:              384 bits
L2 Cache Size:                 786432 bytes
Max Threads Per SMP:           1536
Async Engines:                 1
Unified Addressing:            Yes
Managed Memory:                No
PGI Compiler Option:           -ta=tesla:cc20
PGI GPU 用コンパイラ情報サイト