GPU CUDA 6.0 インストール Scientific Linux / CentOS / Red Hat EL 6.5
PGIアクセラレータ™ コンパイラを使用する前に、NVIDIA社の CUDA™ 開発環境をインストールしておく必要があります。ここでは、 一例として Sceintific Linux 6.5 (RHEL/CentOS 6.5) 上に CUDA 6.0 環境をインストールする手順を説明します。ここでの前提は、ハードウェアシステムの中に、NVIDIA 社の GPU が実装されていることとします。
2014年 5月8日 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.0 ダウンロードサイトのページから Linux RHEL 6 (CentOS 6) のディストリブ-ション用の RPM 用のファイルをダウンロードします。このファイルは、cuda-repo-rhel6-6.0-{revision number}.x86_64.rpm と言うファイルですが、CUDA 用のリポジトリをRPM 管理下にセットするためのファイルです。(以下のファイル名は、2014年5月現在のリビジョンのファイル名です)
$ cd /tmp $ wget http://developer.download.nvidia.com/compute/cuda/repos/rhel6/x86_64/cuda-repo-rhel6-6.0-37.x86_64.rpm
NVIDIA 英文インストレーション・ガイドは、こちらで見ることが出来ますので、併せて参照してください。
事前準備
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 photon30 2.6.32-358.18.1.el6.x86_64 #1 SMP Tue Aug 27 14:23:09 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux (以前に .run ファイルで実装されたCUDAドライバーを削除する) [root@photon30 tmp]# /usr/bin/nvidia-uninstall
CUDA 6.0 の RPM によるインストール
今回は、Scientific Linux (RHEL/CentOS) 6.5 にインストールするため、CUDA ダウンロードサイトにて Red Hat Enterprise Linux 6 (64bit) 用の rpm ファイルをダウンロードします。なお、2014年5月の初旬において、NVIDIA社のダウンロードサイトが不安定で、yum の実行中、cuda の実体ファイルのダウンロードが正常にできない状況がありました。こうした場合は、何回か繰り返して、yum install cuda コマンドの実行を行うことをお勧めします。ダウンロードできなかったファイルのみがリトライするような状況になります。
[root@photon30 tmp]# ls (/tmp配下で行う) cuda-repo-rhel6-6.0-0.x86_64.rpm (CUDAリポジトリのインストール) [root@photon30 tmp]# rpm --install cuda-repo-rhel6-6.0-0.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 rpmforge sl sl-security 4 metadata files removed [root@photon30 tmp]# yum install cuda Loaded plugins: refresh-packagekit, security cuda | 2.5 kB 00:00 cuda/primary_db | 24 kB 00:00 rpmforge | 19 kB 00:00 sl | 3.7 kB 00:00 sl-security | 3.0 kB 00:00 Setting up Install Process Resolving Dependencies (中略) Install 19 Package(s) Upgrade 5 Package(s) Total download size: 793 M Is this ok [y/N]: y (中略) Installed: cuda.x86_64 0:6.0-37 xorg-x11-drv-nvidia.x86_64 1:331.62-2.el6 Dependency Installed: cuda-6-0.x86_64 0:6.0-37 cuda-command-line-tools-6-0.x86_64 0:6.0-37 cuda-core-6-0.x86_64 0:6.0-37 cuda-core-libs-6-0.x86_64 0:6.0-37 cuda-documentation-6-0.x86_64 0:6.0-37 cuda-drivers.x86_64 0:331.62-0 cuda-extra-libs-6-0.x86_64 0:6.0-37 cuda-headers-6-0.x86_64 0:6.0-37 cuda-license-6-0.x86_64 0:6.0-37 cuda-misc-6-0.x86_64 0:6.0-37 cuda-samples-6-0.x86_64 0:6.0-37 cuda-toolkit-6-0.x86_64 0:6.0-37 cuda-visual-tools-6-0.x86_64 0:6.0-37 libvdpau.i686 0:0.7-1.el6 nvidia-uvm-kmod.x86_64 1:331.62-3.el6 xorg-x11-drv-nvidia-gl.i686 1:331.62-2.el6 xorg-x11-drv-nvidia-gl.x86_64 1:331.62-2.el6 Dependency Updated: nvidia-kmod.x86_64 1:331.62-3.el6 xorg-x11-drv-nvidia-devel.i686 1:331.62-2.el6 xorg-x11-drv-nvidia-devel.x86_64 1:331.62-2.el6 xorg-x11-drv-nvidia-libs.i686 1:331.62-2.el6 xorg-x11-drv-nvidia-libs.x86_64 1:331.62-2.el6 Replaced: nvidia-kmod.x86_64 1:319.37-1.el6 nvidia-modprobe.x86_64 0:319.37-1.el6 nvidia-settings.x86_64 0:319.37-30.el6 nvidia-xconfig.x86_64 0:319.37-27.el6 Complete!
環境変数 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.0/lib (32bit用)と /usr/local/cuda-6.0/lib64 (64bit用)が存在します。64ビットの Linux の場合は、LD_LIBRARY_PATHは、/usr/local/cuda-6.0/lib64 と /lib の両方を指定します
【64ビットLinux】LD_LIBRARY_PATH=/usr/local/cuda-6.0/lib64:/lib
【32ビットLinux】LD_LIBRARY_PATH=/usr/local/cuda-6.0/lib
[kato@photon29 tmp]# cd [kato@photon29 etc]# vi .bashrc (前略) export PATH=/usr/local/cuda-6.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-6.0/lib64:/lib:$LD_LIBRARY_PATH :wq [root@photon29 etc]#
CUDAコマンドの実行検証
設定した PATH 環境変数等が反映された別の端末セッションを開き、CUDAコマンドを実行してみます。
[kato@photon29 ~]$ which nvcc /usr/local/cuda-6.0/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-2013 NVIDIA Corporation Built on Thu_Mar_13_11:58:58_PDT_2014 Cuda compilation tools, release 6.0, V6.0.1 [kato@photon29 ~]$ nvcc hello.c nvcc warning : The 'compute_10' and 'sm_10' architectures are deprecated, and may be removed in a future release. [kato@photon29 ~]$ ./a.out HELLO [kato@photon29 ~]$ ldd a.out (shared library のリンク確認) linux-vdso.so.1 => (0x00007fff02fff000) 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 331.62 Wed Mar 19 18:20:03 PDT 2014 GCC version: gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
[kato@photon29 GPGPU]$ pgaccelinfo CUDA Driver Version 6000 <== この番号は、NVIDIAドライバーのバージョン番号 6.0 の意味 NVRM version: NVIDIA UNIX x86_64 Kernel Module 331.62 Wed Mar 19 18:20:03 PDT 2014 Device Number: 0 Device Name: Tesla K20c Device Revision Number: 3.5 Global Memory Size: 5368512512 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: No 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: 100078 microseconds Current free memory: 5286899712 Upload time (4MB): 962 microseconds ( 713 ms pinned) Download time: 1221 microseconds ( 673 ms pinned) Upload bandwidth: 4359 MB/sec (5882 MB/sec pinned) Download bandwidth: 3435 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: 100078 microseconds Current free memory: 1532125184 Upload time (4MB): 1090 microseconds ( 724 ms pinned) Download time: 1161 microseconds ( 671 ms pinned) Upload bandwidth: 3847 MB/sec (5793 MB/sec pinned) Download bandwidth: 3612 MB/sec (6250 MB/sec pinned) PGI Compiler Option: -ta=tesla:cc20