NVIDIA HPC SDKのインストールは簡単です。

従来のtarファイルを展開する方法もあるのですが、ここでは、Linux distributions のパッケージ管理ユーティリティを使用してシステムに実装する方法を説明します。

NVIDIA HPC SDKを使用するために、以下の4つの作業を行います。
その後、テスト・コンパイラをしてみましょう。

2022年8月

GNUツールチェーンのインストール

NVIDIA HPC SDKをインストールする前の準備として、GNUツールチェーン(GCCやGNU Binutils等)の実装を行っておく必要があります。

いわゆる、gcc、gfortranといったGNUのコンパイラスイートを導入することにより、基盤となるリンカ、アセンブラ等のソフトウェア開発環境も実装されます。NVIDIA HPC SDKだけでなく一般の商用コンパイラにおいても、基盤環境としてGNUのツールチェーンを利用しています。

ここでは一般のユーザがよく利用する ubuntu (20.04) の場合を例に、パッケージ管理システムを使って、その実装方法を説明します。
なお、この作業は、NVIDIA HPC SDKをインストールする前に行う必要があります

Ubuntuシステムのリリースバージョンは以下のコマンドで確認できます。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"

gnu gcc開発パッケージをインストールします。
g++とgfortranパッケージも明示的にインストールします。
他のLinux distributionの場合も、gcc/g++/gfortranのパッケージを実装してください。

$ sudo apt install build-essential g++ gfortran

なお、システム内にgnuパッケージが実装されているかどうかは、以下のコマンドで確認できます。

$ dpkg -l | grep gcc
$ dpkg -l | grep g++	
$ dpkg -l | grep gfortran

GNU gccパッケージの実装を確認後、実際にコマンドを実行してバージョン番号を確かめてみます。

$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gnuツールチェーンの実装が終了したのち、NVIDIA HPC SDKのインストールを行います。

NVIDIA HPC SDKソフトウェアのインストール

NVIDIA HPC SDKソフトウェアのインストールの方法は、以下のページを参考にして行います。

https://developer.nvidia.com/nvidia-hpc-sdk-downloads

  1. ライセンス・アグリーメントをチェックします。
nvidia-hpc-sdk-install-page1
1.ライセンス・アグリーメントをチェック
  1. ターゲット・プラットフォーム用のプルダウンメニューが現れ、そのデフォルトとして Linux x86_64用のdistributionの選択肢が現れます。
nvidia-hpc-sdk-install-page2
2.ターゲット・プラットフォーム用のプルダウンメニュー

NVIDIA HPC SDKには、コンパイラや実行環境で使用されるCUDA TOOLKIT のサブセットをバンドルしていますが、その最新バージョンのみをバンドルしたものと、最新を含め過去の3バージョンをバンドルしたもののどちらかを選択できます。

ディスク容量に余裕がある場合は、3バージョンタイプによるインストールをお勧めします。
GPU上での動作を確認するために、過去のCUDAバージョンを使って実行可能モジュールを作成しようとした場合、操作が容易となります。

実際にubuntuのパッケージ管理システムを利用して以下のコマンドを実行してインストールします。

以下の例は、バージョン22.5で、CUDAの三つのバージョンを実装する「nvhpc-22-5-cuda-multi」の場合です。

$ echo 'deb [trusted=yes] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | sudo tee /etc/apt/sources.list.d/nvhpc.list
$ sudo apt-get update -y
$ sudo apt-get install -y nvhpc-22-5-cuda-multi
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
(中略)
nvhpc-2022 (22.5) を設定しています ...
nvhpc-22-5 (22.5) を設定しています ...
nvhpc-22-5-cuda-multi (22.5) を設定しています ...
libc-bin (2.31-0ubuntu9.9) のトリガを処理しています ...

以上の操作で、NVIDIA HPC SDKのソフトウェアのシステムへの実装が終了しました。

ソフトウェアの実装場所は以下となります。
(以下の記述内容は、コンパイラを利用するだけのユーザは読み飛ばしても大丈夫です。)

/opt/nvidia/hpc_sdk/

この配下に、プラットフォームのアーキテクチャタイプのディレクトリ(Linux_x86_64)が作成されます。同列に、Environment Modulesを利用する際のmodulefileのテンプレートを含むディレクトリが作成されています。

当該modulefileの利用方法に関しては、HPC Worldのページにある「1.3.2 Environment Modulesを使う場合」に説明していますので、参考にしてください。

$ cd /opt/nvidia/hpc_sdk/
$ ls
Linux_x86_64  modulefiles

NVIDIA HPC SDKのソフトウェア実態は、Linux_x86_64/バージョン番号の配下に置かれています。
コンパイラやライブラリ群、ツールやcuda toolkit のサブセット等が収められます。

Linux_x86_64配下に2022と22.5の二つのディレクトリが作成されています。
バージョン22.5のソフトウェア実態は、ディレクトリ「22.5」配下に実装され、ディレクトリ「2022」では、2022年版でインストールされている最新バージョン(こここでは22.5)へのシンボリックリンクが設定されています。

例えば、22.5以降の新バージョンをインストールすると、このLinux_x86_64配下に、例えば22.7バージョンのディレクトリが作成されます。その際に、代表ディレクトリである「2022」のシンボリック先は、新しい22.7バージョンに変更されます。

新しいバージョンがインストールされると、古いバージョンは削除されることなく、そのまま残ります。PATHの切り替えで古いバージョンもいつでも利用できるようにしてあります。

一方、ユーザ・シェルの環境変数PATHに設定するコンパイラ用パスに、代表ディレクトリ「2022」を指定すると、複数のバージョンがあったとしても、常に新しいバージョンが使えるような設定になります。

$ cd Linux_x86_64/
$ pwd
/opt/nvidia/hpc_sdk/Linux_x86_64
$ ls
2022  22.5
$ cd 2022
$ ls -l
total 0
lrwxrwxrwx 1 root root 17 May 24 06:08 comm_libs -> ../22.5/comm_libs
lrwxrwxrwx 1 root root 17 May 24 06:08 compilers -> ../22.5/compilers
lrwxrwxrwx 1 root root 12 May 24 06:08 cuda -> ../22.5/cuda
lrwxrwxrwx 1 root root 16 May 24 06:08 examples -> ../22.5/examples
lrwxrwxrwx 1 root root 17 May 24 06:08 math_libs -> ../22.5/math_libs
lrwxrwxrwx 1 root root 17 May 24 06:08 profilers -> ../22.5/profilers

エンドユーザ環境の設定

実際にHPCコンパイラを使用するためには、ユーザ・シェルの環境変数設定が必要となります。

適宜、システム用の .bashrc、.cshrc 等の初期設定ファイルに設定してください。
ユーザのホーム・ディレクトリ直下の .bashrc、.cshrcに追記しても構いません。

bash、sh、ksh等を使用している場合は、以下の設定を行います。
ここでは、バージョン22.5を利用する場合について記載しています。

$ NVARCH=`uname -s`_`uname -m`; export NVARCH
$ NVCOMPILERS=/opt/nvidia/hpc_sdk; export NVCOMPILERS
$ MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/22.5/compilers/man; export MANPATH
$ PATH=$NVCOMPILERS/$NVARCH/22.5/compilers/bin:$PATH; export PATH

cshを使用している場合は、以下の設定となります。

% setenv NVARCH `uname -s`_`uname -m`
% setenv NVCOMPILERS /opt/nvidia/hpc_sdk
% setenv MANPATH "$MANPATH":$NVCOMPILERS/$NVARCH/22.5/compilers/man
% set path = ($NVCOMPILERS/$NVARCH/22.5/compilers/bin $path)

なお、NVIDIA HPC SDKにバンドルされているOpenMPIコマンドを利用する場合は、以下のパスを追記してください。

bash、sh、ksh等の場合
$ export PATH=$NVCOMPILERS/$NVARCH/22.5/comm_libs/mpi/bin:$PATH
$ export MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/22.5/comm_libs/mpi/man

cshの場合
% set path = ($NVCOMPILERS/$NVARCH/22.5/comm_libs/mpi/bin $path)
% setenv MANPATH "$MANPATH":$NVCOMPILERS/$NVARCH/22.5/comm_libs/mpi/man

NVIDIA GPUドライバーのインストール

NVIDIAドライバーは、計算等の用途で実際にGPUデバイスを使って(計算)処理する場合に必要となります。CPUだけを使用する用途でNVIDIA HPCコンパイラを使用する場合、あるいは、GPUを搭載していないシステムでNVIDIA HPCコンパイラをCPU用コンパイラとして使う場合は、NVIDIAドライバーのインストールは必要ありません。

また、NVIDIA HPCコンパイラは、GPUを搭載していないシステムにおいても、クロスコンパイル機能を使って、OpenACC等によるGPUを利用する実行可能モジュールを生成できます。当該モジュールは、GPUが搭載されNVIDIA HPC SDKソフトウェア環境が実装されている、他のシステム上で実行できます。

GPU搭載のシステムではGPUを計算用途で使用することができるため、NVIDIAドライバーをインストールしてください。Ubuntuにおける、その方法を簡単に説明します。

NVIDIA のGPUボードが実装されてシステムに認識されているか、確認します。

$ lspci | grep -i nvidia
21:00.0 VGA compatible controller: NVIDIA Corporation Device 2206 (rev a1)
21:00.1 Audio device: NVIDIA Corporation Device 1aef (rev a1)

Device番号ではなく、GPUの型番を表示させたい場合は、以下コマンドを実行し、pciidの情報の更新を行います。GPUの型番が表示されました。この例では、GeForce RTX 3080が実装されたシステムです。

$ sudo update-pciids 
$ lspci | grep -i nvidia
21:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3080] (rev a1)
21:00.1 Audio device: NVIDIA Corporation GA102 High Definition Audio Controller (rev a1)

次のコマンドを使用して、PPAGPUドライバーリポジトリをシステムに追加します。

sudo add-apt-repository ppa:graphics-drivers/ppa

使用可能なドライバーのリストを表示するには、次のコマンドを実行します。

$ ubuntu-drivers devices
== /sys/devices/pci0000:20/0000:20:00.0/0000:21:00.0 ==
modalias : pci:v000010DEd00002206sv00001462sd0000389Abc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-510 - distro non-free recommended
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-515 - third-party non-free
driver   : nvidia-driver-515-server - distro non-free
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-510-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

インストール可能なドライバーのバージョンが表示されます。recommendedとされているバージョンもありますが、ここではそれよりも新しいバージョンnvidia-driver-515を導入します。特定のドライバーをインストールするには、次のコマンドを実行します。

sudo apt install nvidia-driver-510

変更を有効にするには、マシンを再起動します。その後、端末を開き、nvaccelinfoコマンドでGPU デバイスの情報表示を確認できれば、正常にドライバーも動作しています。2行目にドライバーのバージョン(以下の場合は、515.43.04)が示されています。

$ nvaccelinfo

CUDA Driver Version:           11070
NVRM version:                  NVIDIA UNIX x86_64 Kernel Module  515.43.04  Tue Apr 26 15:52:32 UTC 2022

Device Number:                 0
Device Name:                   NVIDIA GeForce RTX 3080
Device Revision Number:        8.6
Global Memory Size:            10495852544
Number of Multiprocessors:     68
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:                    1740 MHz
Execution Timeout:             Yes
Integrated Device:             No
Can Map Host Memory:           Yes
Compute Mode:                  default
Concurrent Kernels:            Yes
ECC Enabled:                   No
Memory Clock Rate:             9501 MHz
Memory Bus Width:              320 bits
L2 Cache Size:                 5242880 bytes
Max Threads Per SMP:           1536
Async Engines:                 2
Unified Addressing:            Yes
Managed Memory:                Yes
Concurrent Managed Memory:     Yes
Preemption Supported:          Yes
Cooperative Launch:            Yes
  Multi-Device:                Yes
Default Target:                cc86

以上の作業で、NVIDIA HPC SDKのインストールが終了します。

NVIDIA HPC SDKに含まれたHPCコンパイラやOpenMPI等のオープンソースソフトウェア、CUDAライブラリ、CUDAツールなどが使用できるようになります。

また、搭載GPUを計算用途で利用できるようになります。

テスト・コンパイルしてみよう

早速、コンパイルしてみましょう!

まず、コンパイラのバージョンを確かめます。 --version あるいは -Vのオプションを付けてコンパイラ・コマンドを実行します。以下はnvfortranを使用した例です。

$ nvfortran --version
nvfortran 22.5-0 64-bit target on x86-64 Linux -tp skylake-avx512
NVIDIA Compilers and Tools
Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES.  All rights reserved.

バージョン名22.5-0と現在システムに搭載されているCPU(target processor)のアーキテクチャ名skylake-avx512が表示されます。デフォルトでは、システムに搭載されているCPUに最適化したコードを生成します。

簡単なプログラムをコンパイルして実行できることを確認してください。

C++プログラムの例です。

$ cat hello.cpp
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
  cout << "Hello, World!" << endl;
  return 0;
}
$ nvc++ hello.cpp
$ ./a.out
Hello, World!

Cプログラムの例です。

$ cat hello.c
#include <stdio.h>
int main () {
   printf("Hello World\n");
return 0;
}
$ nvc hello.c
$ ./a.out
Hello World

Fortranプログラムの例です。

$ cat hello.f90
print *,"Hello World"
end
$ nvfortran hello.f90
$ ./a.out
Hello World

以上で、コンパイラを利用できる環境が整いました。