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

対象 GPU CUDA 6.5 インストール Scientific Linux / CentOS / Red Hat EL 6.5

 PGIアクセラレータ™ コンパイラを使用する前に、NVIDIA社の CUDA™ 開発環境をインストールしておく必要があります。ここでは、 一例として Sceintific Linux 6.5 (RHEL/CentOS 6.5) 上に CUDA 6.5 環境をインストールする手順を説明します。ここでの前提は、ハードウェアシステムの中に、NVIDIA 社の GPU が実装されていることとします。
2014年 9月9日 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) ボードが搭載された場合の状況を示しています。

[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 Device 1022 (rev a1)

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

 CUDA 6.0 バージョンから Linux の RPM (Package Manager) によるインストールが可能となりました。今回は、この方法で CUDA をインストールする方法を説明します。(従来の Runfile によるインストール方法もあります。Runfile による方法は、過去の CUDA 5.0 インストール方法をご参照ください。)上記の CUDA 6.5 ダウンロードサイトのページから Linux RHEL 6 (CentOS 6) のディストリブ-ション用の RPM 用のファイルをダウンロードします。このファイルは、cuda-repo-rhel6-6.5-{revision number}.x86_64.rpm と言うファイルですが、CUDA 用のリポジトリをRPM 管理下にセットするためのファイルです。(以下のファイル名は、2014年9月現在のリビジョンのファイル名です)

$ cd /tmp
$ wget http://developer.download.nvidia.com/compute/cuda/repos/rhel6/x86_64/cuda-repo-rhel6-6.5-14.x86_64.rpm

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

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

事前準備

RedHat系の場合、DKMS / libvdpauのような他の外部パッケージに依存するため、rpmforge 等のサードパーティのリポジトリのセットが必要となります。以下のコマンドにより、rpmforgeのためのセットアップを行います。yum を用いてリポジトリのセットを行います。

# yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

 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 2.6.32-431.17.1.el6.x86_64 #1 SMP Wed May 7 14:14:17 CDT 2014 x86_64 x86_64 x86_64 GNU/Linux

(以前に .run ファイルで実装されたCUDAドライバーを削除する)
[root@photon30 tmp]# /usr/bin/nvidia-uninstall

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

 今回は、Scientific Linux (RHEL/CentOS) 6.5 にインストールするため、CUDA ダウンロードサイトにて Red Hat Enterprise Linux 6 (64bit) 用の rpm ファイルをダウンロードします。yum の実行中、cuda の実体ファイルのダウンロードが正常にできない状況や yum 自体のエラー等がありました。こうした場合は、何回か繰り返して、yum install cuda コマンドの実行を行うことをお勧めします。ダウンロードできなかったファイルのみがリトライするような状況になります。

  • cuda-repo-rhel6-6.5-14.x86_64.rpm
[root@photon30 tmp]# ls            (/tmp配下で行う)
cuda-repo-rhel6-6.5-14.x86_64.rpm

(CUDAリポジトリのインストール)
[root@photon30 tmp]# rpm --install cuda-repo-rhel6-6.5-14.x86_64.rpm 

[root@photon30 tmp]# ls /etc/yum.repos.d/  (yum のリポジトリ確認、cuda.repoが作成されている)
cuda.repo         mirrors-rpmforge-extras   rpmforge.repo  sl-updates.repo.rpmsave  sl.repo.rpmsave
mirrors-rpmforge  mirrors-rpmforge-testing  sl-other.repo  sl.repo

[root@photon30 tmp]# yum clean expire-cache
Loaded plugins: refresh-packagekit, security
Cleaning repos: cuda epel rpmforge sl sl-security
6 metadata files removed


[root@photon30 tmp]# yum install cuda
Loaded plugins: refresh-packagekit, security
cuda                   | 2.5 kB     00:00
cuda/primary_db        |  56 kB     00:00
epel                   | 4.4 kB     00:00
epel/primary_db        | 6.3 MB     00:15
rpmforge               | 1.9 kB     00:00
rpmforge/primary_db    | 2.7 MB     01:35
sl                     | 3.6 kB     00:00
sl-security            | 3.0 kB     00:00
sl-security/primary_db | 4.0 MB     00:09

Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package cuda.x86_64 0:6.0-37 will be updated
---> Package cuda.x86_64 0:6.5-14 will be an update
--> Processing Dependency: cuda-6-5 = 6.5-14 for package: cuda-6.5-14.x86_64

(中略)

Install      24 Package(s)
Upgrade      10 Package(s)

Total download size: 913 M
Is this ok [y/N]: y

(中略)

Installed:
  xorg-x11-drv-nvidia.x86_64 1:340.29-1.el6

Dependency Installed:
  cuda-6-5.x86_64 0:6.5-14                  cuda-command-line-tools-6-5.x86_64 0:6.5-14     cuda-core-6-5.x86_64 0:6.5-14
  cuda-cublas-6-5.x86_64 0:6.5-14           cuda-cublas-dev-6-5.x86_64 0:6.5-14             cuda-cudart-6-5.x86_64 0:6.5-14
  cuda-cudart-dev-6-5.x86_64 0:6.5-14       cuda-cufft-6-5.x86_64 0:6.5-14                  cuda-cufft-dev-6-5.x86_64 0:6.5-14
  cuda-curand-6-5.x86_64 0:6.5-14           cuda-curand-dev-6-5.x86_64 0:6.5-14             cuda-cusparse-6-5.x86_64 0:6.5-14
  cuda-cusparse-dev-6-5.x86_64 0:6.5-14     cuda-documentation-6-5.x86_64 0:6.5-14          cuda-misc-headers-6-5.x86_64 0:6.5-14
  cuda-npp-6-5.x86_64 0:6.5-14              cuda-npp-dev-6-5.x86_64 0:6.5-14                cuda-runtime-6-5.x86_64 0:6.5-14
  cuda-samples-6-5.x86_64 0:6.5-14          cuda-toolkit-6-5.x86_64 0:6.5-14                cuda-visual-tools-6-5.x86_64 0:6.5-14

Updated:
  cuda.x86_64 0:6.5-14

Dependency Updated:
  cuda-drivers.x86_64 0:340.29-0                                   nvidia-uvm-kmod.x86_64 1:340.29-3.el6
  xorg-x11-drv-nvidia-devel.i686 1:340.29-1.el6                    xorg-x11-drv-nvidia-devel.x86_64 1:340.29-1.el6
  xorg-x11-drv-nvidia-gl.i686 1:340.29-1.el6                       xorg-x11-drv-nvidia-gl.x86_64 1:340.29-1.el6
  xorg-x11-drv-nvidia-libs.i686 1:340.29-1.el6                     xorg-x11-drv-nvidia-libs.x86_64 1:340.29-1.el6

Replaced:
  nvidia-kmod.x86_64 1:331.62-3.el6

Complete!

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

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

環境変数 PATH と LD_LIBRARY_PATH

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

 【64ビットLinux】LD_LIBRARY_PATH=/usr/local/cuda-6.5/lib64:/lib
 【32ビットLinux】LD_LIBRARY_PATH=/usr/local/cuda-6.5/lib

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

CUDAコマンドの実行検証

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

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

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

[kato@photon29 ~]$ nvcc -V (nvcc コンパイラのバージョン確認)
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2014 NVIDIA Corporation
Built on Thu_Jul_17_21:41:27_CDT_2014
Cuda compilation tools, release 6.5, V6.5.12

[kato@photon29 ~]$  nvcc hello.c
 
[kato@photon29 ~]$ ./a.out
 HELLO
[kato@photon29 ~]$ ldd a.out (shared library のリンク確認)
        linux-vdso.so.1 =>  (0x00007fffeddff000)
        librt.so.1 => /lib64/librt.so.1 (0x0000003fcac00000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003fca400000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003fc9c00000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003fd6400000)
        libm.so.6 => /lib64/libm.so.6 (0x0000003fca800000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003fd5400000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003fca000000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003fc9800000)

 以上で、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  340.29  Thu Jul 31 20:23:19 PDT 2014
GCC version:  gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
[kato@photon29 GPGPU]$ pgaccelinfo
CUDA Driver Version            6050  <== この番号は、NVIDIAドライバーのバージョン番号 6.5 の意味
NVRM version:                  NVIDIA UNIX x86_64 Kernel Module  340.29  Thu Jul 31 20:23:19 PDT 2014

Device Number:                 0
Device Name:                   Tesla K20c
Device Revision Number:        3.5
Global Memory Size:            5032706048
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
Initialization time:           9059 microseconds
Current free memory:           4949217280
Upload time (4MB):              962 microseconds ( 716 ms pinned)
Download time:                 1250 microseconds ( 673 ms pinned)
Upload bandwidth:              4359 MB/sec (5857 MB/sec pinned)
Download bandwidth:            3355 MB/sec (6232 MB/sec pinned)
PGI Compiler Option:           -ta=tesla:cc35

Device Number:                 1
Device Name:                   GeForce GTX 580
Device Revision Number:        2.0
Global Memory Size:            1609760768
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
Initialization time:           9059 microseconds
Current free memory:           1501134848
Upload time (4MB):             1095 microseconds ( 725 ms pinned)
Download time:                 1314 microseconds ( 671 ms pinned)
Upload bandwidth:              3830 MB/sec (5785 MB/sec pinned)
Download bandwidth:            3192 MB/sec (6250 MB/sec pinned)
PGI Compiler Option:           -ta=tesla:cc20
PGI GPU 用コンパイラ情報サイト