[Ubuntu 22.04] NVIDIA HPC SDK インストール

## はじめに
　AliexpressなどでNvidia Tesla P100 GPGPUボード価格が下がっており自作感覚でGPU HPCコンピュータを構築できる環境になりつつある。これはP100が生産終了になっているためデータセンター落ちの中古数が増えたためだと思う。加えてP100にはTensor Coreも実装されていないため今どきのAIにはやや機能不足もあるだろう。
　とはいえ私も仕事でSupermicro製ワークステーション用マザボとマイニングリグなどを使い1CPUに対してP100を8枚実装した自作HPCワークステーション構築した経験もある。科学技術計算用途ではまだ現役で行けるものもあるのだ。
　ハード導入の障壁は下がったがソフト導入の日本語情報が少ないことに苦労したのでメモ書き。

 ## NVIDIA HPC SDK
　NVIDIA HPC(High Performance Computing) SDK (Software Development Kit)はNVIDIA製GPUを用いた高速計算プログラム開発環境であり、[こちら](https://developer.nvidia.com/hpc-sdk "NVIDIA HPC SDK")で公開されている。

 ## ダウンロード
　[トップページ](https://developer.nvidia.com/hpc-sdk "NVIDIA HPC SDK")下部にある”Download Now”よりダウンロードページに移動、License Agreementにチェックを入れるとLinuxディストリビューションや導入法ごとのアイコンが現れる。好きな方法を選べば良い。
  ![downloader.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/ee88d04d-e606-78de-e60b-754bff92a4c9.jpeg)
　表示されるのは最新バージョンである。しかしビルドしたいプログラムによっては古いバージョンを必要とするものがある。その場合は下部の”HPC SDK Releases”アイコンをクリックすると過去バージョンの一覧が出るので必要なものを選択すれば良い。

![oldversion.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636689/843a46c2-47e9-42bf-83c4-3526a9841510.jpeg)

 ## ソースファイルからの導入
 ダウンロードページの"Linux x86_64 (tar file)"アイコンをクリックするとダウンロードURL、解凍コマンド、インストールコマンドが表示される。ダウンロードはターミナルから行える。
　2023年12月時点の最新バージョンは23.11で含まれるCUDAのバージョンは12.3。このときダウンロードしたファイル名はnvhpc_2023_2311_Linux_x86_64_cuda_12.3.tar.gzだった。
ファイルサイズは5GB超えなので気長に待つ。
　ホームページに記載されているオプション含む好きなtarオプションを使ってtar.gzファイルを解凍。解凍してできるnvhpc_2023_2311_Linux_x86_64_cuda_12.3ディレクトリ内のinstallerがインストーラーなのだが実行権限がないためホームページの記載どおりには実行できない。chmodで実行権限を与えるか./で実行。
　Ubuntuの場合、/opt/nvidia/以下にインストールされる関係からsudoで実行する必要がある。ファイル権限変更が面倒だったので下記でインストール実行
```terminal:terminal
sudo ./nvhpc_2023_2311_Linux_x86_64_cuda_12.3/install
```
インストールが始まり下記メッセージが表示される。
```terminal:nvidia hpc sdk installer message
Welcome to the NVIDIA HPC SDK Linux installer!

You are installing NVIDIA HPC SDK 2023 version 23.11 for Linux_x86_64.
Please note that all Trademarks and Marks are the properties
of their respective owners.

Press enter to continue...
```
\<Enter\>
```terminal:nvidia hpc sdk installer message
A single system installation is appropriate for a single system or a
homogeneous cluster.  A network installation should be selected for a
heterogeneous cluster.  For either a single system or network installation,
the HPC SDK configuration (localrc) is created at install time and saved
in the installation directory.

An auto installation is appropriate for any scenario.  The HPC SDK
configuration (localrc) is created at first use and stored in each user's
home directory.

1  Single system install
2  Network install
3  Auto install

Please choose install option: 
```
1\<Enter\>
```terminal:nvidia hpc sdk installer message
Please specify the directory path under which the software will be installed.
The default directory is /opt/nvidia/hpc_sdk, but you may install anywhere
you wish, assuming you have permission to do so.

Installation directory? [/opt/nvidia/hpc_sdk] 
```
\<Enter\>
```terminal:nvidia hpc sdk installer message
Installing NVIDIA HPC SDK version 23.11 into /opt/nvidia/hpc_sdk
```
インストールが終わるまで待ち
```terminal:nvidia hpc sdk installer message
Making symbolic link in /opt/nvidia/hpc_sdk/Linux_x86_64

generating environment modules for NV HPC SDK 23.11 ... done.
Installation complete.
HPC SDK successfully installed into /opt/nvidia/hpc_sdk

If you use the Environment Modules package, that is, the module load
command, the NVIDIA HPC SDK includes a script to set up the
appropriate module files.

% module load /opt/nvidia/hpc_sdk/modulefiles/nvhpc/23.11
% module load nvhpc/23.11

Alternatively, the shell environment may be initialized to use the HPC SDK.

In csh, use these commands:

% set path = (/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin $path)
% setenv MANPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/man:"$MANPATH"

To use MPI, also set:

% set path = (/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/mpi/bin $path)

In bash, sh, or ksh, use these commands:

$ export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin:$PATH
$ export MANPATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/man:$MANPATH

To use MPI, also set:

$ export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/mpi/bin:$PATH

Please check https://developer.nvidia.com for documentation,
use of NVIDIA HPC SDK software, and other questions.
```
上記メッセージに従い~/.bashrcへ下記を追記
```terminal:~/.bashrc
export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin:$PATH
export MANPATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/man:$MANPATH
export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/mpi/bin:$PATH
export MANPATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/mpi/man:$MANPATH
```
4行目はnvidia hpc sdk ver. 23.11インストーラーメッセージに含まれていないが古いバージョンでは入力推奨されていたもの。これを入れないとconfigureでエラーがでるプログラムもあるので入力したほうが無難。
　ターミナルで.bashrcを再入力後、pgccのバージョンを調べ出力があればインストール完了。
```terminal:terminal
$ > source ~/.bashrc
$ > pgcc -V

pgcc (aka nvc) 23.11-0 64-bit target on x86-64 Linux -tp alderlake 
PGI Compilers and Tools
Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES.  All rights reserved.
```
環境によってはnvidia hpc sdkライブラリリンクエラーが出る場合がある。その場合はLD_LIBRARY_PATHにパスを追加すれば良い。このあたりはエラーメッセージで検索すれば情報にヒットする。

## 最後に
　Nvidia製GPUがインストールされていればこれでCUDAプログラミング環境が整う。もちろんC，C++、FORTRAN開発環境としても使える。
　Quantum Espresso（QE）やLammpsのソースコードはNVIDIA GPGPUやGPU計算に対応している。QEのGPGPU版ビルドについては別の機会にメモ書きしよう、かな（未定）。