NVIDIA HPC SDKのインストールと実行

# 概要
NVIDIA HPC SDK（以下，HPC SDK）のEarly Access Programに応募したところ，無事承認されたので，試してみました．

現状，HPC SDKのリソースにアクセスしてよいのは，Early Access Programに登録している人だけです．
そのため，ドキュメントをどの程度参照してよいのか判らず，情報がぼかし気になっています．

# NVIDIA HPC SDKのEarly Access Request
[The NVIDIA HPC SDK](https://developer.nvidia.com/hpc-sdk)のページにRequest Early Accessボタンがあるので，それをクリックしてページを移動し，さらにJoin Nowボタンをクリックし，出てきたフォームに必要事項を記入してHPC SDKのEarly Accessをリクエストします．
どのくらいで承認されるのかは判りませんが，しばらくすると，承認された事が書かれた非常に簡素なメールが来ます．

# NVIDIA HPC SDKのダウンロード
Early Access Requestが承認されると，Member areaへ行くことができるようになります．
Member areaでHPC SDKがダウンロードできます．

現状で対応しているアーキテクチャは

- Linux x86_64
- Linux OpenPOWER
- Linux Arm

のみで，Windows向けの提供は，もう少し後になるようです．

インストール方法は，この記事執筆時点（2020年6月9日）ではローカルインストールしか用意されておらず，どのアーキテクチャを選んでも，4 GBほどの圧縮ファイルをダウンロードすることになります．

また，ダウンロードページには，HPC SDKの依存ファイルが書いてあります．

- プロファイラを使う場合はJava Runtime 1.6以降
- CUDA 10.1以降のドライバ

HPC SDKには，CUDA 10.1, 10.2, 11.0が同梱されているので，わざわざCUDAを別途ダウンロードしてインストールする必要はないと思われます．すでにCUDA環境を整えている場合は，インストール時に環境変数を設定することで，CUDAをインストールしないようにできます．

# NVIDIA HPC SDKのインストール
## インストール
ダウンロードした圧縮ファイルを解凍し，インストール用のシェルスクリプトを実行すると，対話的にインストールが進んでいきます．このとき，環境変数を設定すると，silent installできるようになるようです．環境変数については，Installation Guideで確認できます．

インストールは以下の手順で進んでいきます．

1. エンドユーザライセンスの確認
1. インストール方法の選択（ローカルインストール[^single_system_install]かネットワークインストールか）[^select]
1. インストールディレクトリの選択（標準は`/opt/nvidia/hpcsdk`）[^defaultdir]
1. 2020ディレクトリへのシンボリックリンクの作成・更新
1. Open MPIのインストール
1. Open MPIのNVIDIA GPUサポートの有効化

[^single_system_install]: Single system installと書かれています．
[^select]: ネットワークインストールは試していません．4 GBもダウンロードさせておいて何を言うかとう感じですが，今後ネットワークインストールにも対応してくれるのでしょう．
[^defaultdir]: Installation Guideには，`/opt/nvidia/hpc_sdk`が標準ディレクトリだと書かれていて，その後の設定も`/opt/nvidia/hpc_sdk`が用いられています．

## パスの設定
どのようにパスを設定するかはInstallation Guideに書いてあるので，それに沿って設定するだけです．

パスを設定するのは，HPC SDKのコンパイラの`bin`と`man`，Open MPIをインストールしていれば，それの`bin`と`man`の，計4カ所です．

HPC SDKをデフォルトディレクトリ（`/opt/nvidia/hpcsdk`）にインストールしたとすると，それ以下の`Linux_x86_64/20.5/compilers/bin`および`Linux_x86_64/20.5/compilers/man`にパスを通します．

Open MPIは`/opt/nvidia/hpcsdk`下の`/Linux_x86_64/2020/mpi/openmpi-3.1.5/`にインストールされるので，`openmpi-3.1.5/`直下の`bin`ディレクトリにパスを通します．また，Installation Guideでは，`openmpi-3.1.5/`直下の`man`にもパスを通すように書かれていますが，manのディレクトリは，`openmpi-3.1.5/share/man`なので，私は`openmpi-3.1.5/share/man`の方にパスを通しました．

結局，私の環境では下記4カ所にパスを通しました．

- `/opt/nvidia/hpcsdk/Linux_x86_64/20.5/compilers/bin`
- `/opt/nvidia/hpcsdk/Linux_x86_64/20.5/compilers/man`
- `/opt/nvidia/hpcsdk/Linux_x86_64/2020/mpi/openmpi-3.1.5/bin`
- `/opt/nvidia/hpcsdk/Linux_x86_64/2020/mpi/openmpi-3.1.5/share/man`

# コンパイラの呼出し
インストールができたので，いよいよFortranコンパイラ界に登場した新入りを呼び出してみます．HPC SDKに同梱されているFortranコンパイラの実行ファイル名は，`nvfortran`です．

`nvfortran`のバージョンを表示してみたところ，無事に呼び出されました．

```console
$ nvfortran --version

nvfortran 20.5-0 LLVM 64-bit target on x86-64 Linux -tp skylake
NVIDIA Compilers and Tools
Copyright (c) 2020, NVIDIA CORPORATION.  All rights reserved.
```

次に，hello worldをコンパイルして実行してみます．

```fortran:hello.f90
program main
    implicit none

    print *, "Hello NVIDIA HPC SDK"

end program main
```

```console
$ nvfortran hello.f90
$ vim hello.f90
$ ./a.out
 Hello NVIDIA HPC SDK
$
```

無事コンパイルして，実行できました．

（2020年6月11日追記）
ヘルプを表示する場合は，`-help`オプションを付けて実行してください．

```console
$ nvfortran -help
```

# まとめ
NVIDA HPC SDKにEarly Accessできるようになったので，早速インストールして実行してみました．
Installation Guideにはちらほらと不整合がみられますが，致命的ではないと思います．

Fortranコンパイラは多くありますが，コンパイラ間の可搬性が非常に低いので，nvfortranがどのような挙動で，どのFortran規格まで実装されているか，確認してまとめたいと思います．
前身がPGI Fortranなので，かなり頑張らないといけない印象ですが，最後に使ったバージョン（18.7）から進化していることを期待します．
簡単に試したところ，`block`構文は使えるようになっていました．バンザイ．