4. ソフトウェア環境¶
4.1. 利用環境の切換え方法¶
本システムでは、Environment Modules(moduleコマンド)を使用することでコンパイラやアプリケーション利用環境の切り替えを行うことができます。
Environment Modulesについては man module または公式サイトをご参照ください。
4.1.1. 利用可能なmodule環境の表示¶
利用可能なmodule環境はmodule availまたはmodule avaで確認できます。
$ module avail
読み込めるバージョンについてはTSUBAME計算サービスWebページのシステム構成の下記項目をご確認下さい。
システムソフトウェア
サポートされているアプリケーション
4.1.2. module環境の設定情報表示¶
module環境の設定情報を確認したい場合、「module whatisモジュール名」を実行します。
$ module whatis intel/2024.0.2
-------------------------------- /apps/t4/rhel9/modules/modulefiles/compiler --------------------------------
intel/2024.0.2: Intel oneAPI compiler 2024.0 and MKL
4.1.3. module環境のロード¶
module環境をロードしたい場合、「module load モジュール名」を実行します。
$ module load intel
バッチスクリプトにおいてロードするmoduleは、コンパイル時と同様のものをロードしてください。
4.1.4. module環境の表示¶
現在使用しているmodule環境を確認したい場合、「module list」を実行します。
$ module list
Currently Loaded Modulefiles:
1) intel/2024.0.2 2) cuda/12.3.2
4.1.5. module環境のアンロード¶
ロードしたmodule環境をアンロードしたい場合「module unload モジュール名」を実行します。
$ module list
Currently Loaded Modulefiles:
1) intel/2024.0.2 2) cuda/12.3.2
$ module unload cuda
$ module list
Currently Loaded Modulefiles:
1) intel/2024.0.2
4.1.6. module環境の初期化¶
ロードしたmodule環境を初期化したい場合、「module purge」を実行します。
$ module list
Currently Loaded Modulefiles:
1) intel/2024.0.2 2) cuda/12.3.2
$ module purge
$ module list
No Modulefiles Currently Loaded.
4.3. Intelコンパイラ¶
本システムではコンパイラとして、Intel コンパイラ (oneAPI) 、AMD コンパイラ (AOCC)、NVIDIA コンパイラ (NVIDIA HPC SDK) および GNU コンパイラが利用できます。
Intel コンパイラの各コマンドは以下のとおりです。
コマンド | 言語 | コマンド形式 | 旧コマンド(廃止) |
---|---|---|---|
ifx | Fortran 77/90/95 | $ ifx [オプション] source_file |
ifort |
icx | C | $ icx [オプション] source_file |
icc |
icpx | C++ | $ icpx [オプション] source_file |
icpc |
利用する際は、moduleコマンドでintelを読み込んでください。--helpオプションを指定して頂くとコンパイラオプションの一覧が表示されます。
Info
Intel oneAPI 2024から、iccコマンドおよびicpcコマンドが使用できなくなりました。 icxコマンドおよびicpxコマンドを使用してください。 また、ifortコマンドについても将来的な廃止が示唆されているため、ifxコマンドの使用を推奨します。
Info
Intel oneAPI 2024から、C++のデフォルトの規格がC++14からC++17に変更になりました。それに伴い、一部文法がエラーとなります。詳細についてはこちらをご参照ください。
4.3.1. コンパイルの主なオプション¶
コンパイルの最適化オプションを以下に示します。
オプション | 説明 |
---|---|
-O |
O2 と同じ。 |
-O0 |
すべての最適化を無効にします。 |
-O1 |
最適化を有効にします。コードサイズを大きくするだけで高速化に影響を与えるような一部の最適化を無効にします。 |
-O2 |
最適化を有効にします。一般的に推奨される最適化レベルです。 ベクトル化は O2 以上のレベルで有効になります。-Oオプションを指定しない場合、デフォルトでこちらが指定されます。 |
-O3 |
O2 よりも積極的に最適化を行い、融合、アンロールとジャムのブロック、IF 文の折りたたみなど、より強力なループ変換を有効にします。 |
-xCORE-AVX512 |
Intel プロセッサー向けのIntel アドバンスト・ベクトル・エクステンション 512 (Intel AVX512)、Intel AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel AVX512 命令セット対応のIntel プロセッサー向けに最適化します。 |
-xCORE-AVX2 |
Intel プロセッサー向けのIntel アドバンスト・ベクトル・エクステンション 2 (Intel AVX2)、Intel AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel AVX2 命令セット対応のIntel プロセッサー向けに最適化します。 |
-xSSE4.2 |
Intel プロセッサー向けのIntel SSE4 高効率および高速な文字列処理命令、Intel SSE4 ベクトル化コンパイラ命令およびメディア・アクセラレーター命令、およびIntel SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel SSE4.2 命令セット対応のIntel プロセッサー向けに最適化します。 |
-xSSSE3 |
Intel プロセッサー向けのIntel SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel SSSE3 命令セット対応のIntel プロセッサー向けに最適化します。xオプションを指定しない場合、デフォルトでこちらが指定されます。 |
-qopt-report=n |
最適化レポートを生成します。デフォルトでは、レポートは.optrpt 拡張子を持つファイルに出力されます。nには、0 (レポートなし) から5 (最も詳しい) の詳細レベルを指定します。デフォルトは 2 です。 |
-fp-model precise |
浮動小数点演算のセマンティクスを制御します。浮動小数点データの精度に影響する最適化を無効にし、中間結果をソースで定義された精度まで丸めます。 |
-g |
-gオプションはオブジェクト・ファイルのサイズを大きくするシンボリック・デバッグ情報をオブジェクト・ファイルに生成するようにコンパイラに指示します。 |
-traceback |
このオプションは、ランタイム時に致命的なエラーが発生したとき、ソースファイルのトレースバック情報を表示できるように、オブジェクト・ファイル内に補足情報を生成するようにコンパイラに指示します。 致命的なエラーが発生すると、コールスタックの 16 進アドレス (プログラム・カウンター・トレース) とともに、ソースファイル、ルーチン名、および行番号の相関情報が表示されます。 マップファイルとエラーが発生したときに表示されるスタックの 16 進アドレスを使用することで、エラーの原因を特定できます。 このオプションを指定すると、実行プログラムのサイズが増えます。 |
4.3.2. コンパイルの推奨最適化オプション¶
コンパイルの推奨最適化オプションを以下に示します。本システムに搭載している AMD EPYC 9654 は、Intel AVX512 命令セットに対応していますので、-xCORE-AVX512オプションを指定することができます。-xCORE-AVX512を指定すると、コンパイラがソースコードを解析し、最適なAVX512、AVX2、AVX、SSE命令を生成します。推奨最適化オプションは積極的な最適化を行い、かつ安全なオプションです。最適化のために計算の順序を変更する可能性があり、結果に誤差が生じる場合があります。
Info
Intel Xeon (Skylake 以降)で採用された AVX512 は、AMD では本システムに搭載している Zen4 アーキテクチャの第4世代 EPYC で対応しました。
オプション | 説明 |
---|---|
-O3 |
O2 最適化を行い、融合、アンロールとジャムのブロック、IF 文の折りたたみなど、より強力なループ変換を有効にします。 |
-xCORE-AVX512 |
Intel プロセッサー向けのIntel アドバンスト・ベクトル・エクステンション 512 (Intel AVX512)、Intel AVX2、AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel AVX512 命令セット対応のIntel プロセッサー向けに最適化します。 |
上記のオプションを使用することにより、プログラムの性能が悪化した場合、最適化のレベルを-O2に下げるかベクトル化のオプションを変更してください。 また、結果が一致していない場合、浮動小数点のオプションも試してみてください。
4.3.3. Intel 64アーキテクチャーのメモリモデル指定¶
次のいずれかのメモリモデルを使用して実行バイナリを作成します。
メモリモデル | 説明 |
---|---|
small (-mcmodel=small ) |
コードとデータのすべてのアクセスが、命令ポインター (IP) 相対アドレス指定で行われるように、コードとデータはアドレス空間の最初の 2GB までに制限されます。 -mcmodelオプションを指定しない場合、デフォルトでこちらが指定されます。 |
medium (-mcmodel=medium ) |
コードはアドレス空間の最初の 2GB までに制限されますが、データは制限されません。コードは IP 相対アドレス指定でアクセスできますが、データのアクセスは絶対アドレス指定を使用する必要があります。 |
large (-mcmodel=large ) |
コードもデータも制限されません。コードもデータもアクセスは絶対アドレス指定を使用します。 |
IP 相対アドレス指定は 32 ビットのみ必要ですが、絶対アドレス指定は 64 ビット必要です。 これは、コードサイズとパフォーマンスに影響します。 (IP 相対アドレス指定の方が多少速くアクセスできます。)
プログラム内の共通ブロック、グローバルデータ、静的データの合計が2GBを越えるとき、リンク時に次のエラーメッセージが出力されます。
<some lib.a library>(some .o): In Function <function>:
: relocation truncated to fit: R_X86_64_PC32 <some symbol>
…………………
: relocation truncated to fit: R_X86_64_PC32 <some symbol>
この場合は、-mcmodel=medium
と-shared-intel
を指定してコンパイル/リンクして下さい。
medium メモリモデルまたは large メモリモデルを指定した場合、Intelのランタイム・ライブラリの適切なダイナミック・バージョンが使用されるように、-shared-intel コンパイラ・オプションも指定する必要があります。
4.4. NVIDIA HPC SDK¶
NVIDIA HPC SDK (旧PGIコンパイラ)の各コマンドは以下のとおりです。
コマンド | 言語 | コマンド形式 | 旧コマンド |
---|---|---|---|
nvfortran | Fortran 77/90/95/2003/2008/2018 | $ nvfortran [オプション] source_file |
pgfortran |
nvc | C | $ nvcc [オプション] source_file |
pgcc |
nvc++ | C++ | $ nvc++ [オプション] source_file |
pgc++ |
各コマンドの詳細は$ man nvcc
等でご確認下さい。
利用する際は、moduleコマンドでnvhpcを読み込んでください。--helpオプションを指定して頂くとコンパイラオプションの一覧が表示されます。
4.5. AOCC¶
AMD Optimizing C/C++ and Fortran Compilers (AOCC) の各コマンドは以下のとおりです。
コマンド | 言語 | コマンド形式 |
---|---|---|
flang (clang) | Fortran 95/2003/2008 | $ flang [オプション] source_file |
clang | C | $ clang [オプション] source_file |
clang-cpp (clang) | C++ | $ clang-cpp [オプション] source_file |
利用する際は、moduleコマンドでaoccを読み込んでください。--helpオプションを指定して頂くとコンパイラオプションの一覧が表示されます。
4.6. GPU環境¶
本システムではGPU(NVIDIA H100 SXM5)の利用環境を提供しております。
4.6.1. インタラクティブジョブの実行・デバッグ¶
ログインノード(login, login1, login2)には、GPUを搭載しておらず、コンパイル、リンクのみ実行可能です。 また、ログインノードにおける高負荷プログラムの実行は制限されています。
インタラクティブでの実行、デバックについては、バッチシステムを使用して実行可能です。 詳細については、インタラクティブジョブの投入を参照ください。
4.6.2. 対応アプリケーション¶
現在のGPU対応アプリケーションは次の通りです。(2024.4.1現在)
- ABAQUS 2024 --- ABAQUS利用の手引(別冊) を参照ください。
- ANSYS 2024R1 --- ANSYS 利用の手引(別冊) を参照ください。
- AMBER 22up05 --- AMBER利用の手引(別冊) を参照ください。
- Mathematica 14 --- Mathematica利用の手引(別冊) を参照ください。
- MATLAB 2024 --- MATLAB利用の手引(別冊) を参照ください。
- Linaro forge(旧:Arm Forge) --- 講習会内の「並列プログラミング」を参照ください。
- NVIDIA HPC SDK --- NVIDIA コンパイラ 利用の手引(別冊) を参照ください。
他のアプリケーションにつきまても、順次展開してまいります。
4.6.3. CUDA 対応のMPI¶
CUDA版に対応したMPI環境を用意しております。
OpenMPI + gcc環境
# OpenMPI, GCC環境の読込
$ module load openmpi/5.0.2-gcc
Loading openmpi/5.0.2-gcc
Loading requirement: cuda/12.3.2
Info
必要な関連 module は自動でロードされます。
OpenMPI + NVIDIA HPC SDK環境
# OpenMPI、NVIDIA HCP SDK 環境の読込
$ module load openmpi/5.0.2-nvhpc
Loading openmpi/5.0.2-nvhpc
OpenMPI + Intel環境
# OpenMPI, Intel環境の読込
$ module load openmpi/5.0.2-intel
Loading openmpi/5.0.2-intel
Loading requirement: intel/2024.0.2 cuda/12.3.2
Info
必要な関連 module は自動でロードされます。
4.7. コンテナの利用¶
TSUBAME4.0では、HPC向けコンテナ環境として Apptainer(旧:Singularity) が利用可能です。
Apptainer の使い方の例を以下に記します。
4.7.1. イメージの作成¶
Apptainer のイメージ作成手順例について以下に示します。ここでは、Ubuntu の最新 Docker イメージを使用します。
[オプション]
- -nv : GPUを使用する
- -B : ファイルシステムをマウントする
- -s : サンドボックス形式でイメージをビルドする
$ mkdir $HOME/apptainer
$ cd $HOME/apptainer
$ apptainer build -s ubuntu/ docker://ubuntu:latest
INFO: Starting build...
Getting image source signatures
Copying blob 49b384cc7b4a done
Copying config bf3dc08bfe done
Writing manifest to image destination
Storing signatures
2024/05/29 13:07:49 info unpack layer: sha256:49b384cc7b4aa0dfd16ff7817ad0ea04f1d0a8072e62114efcd99119f8ceb9ed
2024/05/29 13:07:50 warn xattr{etc/gshadow} ignoring ENOTSUP on setxattr "user.rootlesscontainers"
2024/05/29 13:07:50 warn xattr{$HOME/apptainer/build-temp-2088960457/rootfs/etc/gshadow} destination filesystem does not support xattrs, further warnings will be suppressed
INFO: Creating sandbox directory...
INFO: Build complete: ubuntu/
$ cd ubuntu/
$ mkdir gs apps # /gs /apps をマウントするためのディレクトリを作成します
$ cd ../
4.7.2. シェルの起動¶
Apptainer でシェルを起動する手順例について以下に示します。 ここでは、イメージの作成 で作成したイメージを使用します。
[オプション]
- -nv : GPUを使用する
- -B : ファイルシステムをマウントする
- -f (--fakeroot) : コンテナ内でroot権限を行使する
- -w (--writable) : コンテナ内への書き込みを可能にする
Info
-w (--writable) オプションは必ず指定してください。
指定しない場合、正常に起動しないことを確認しています。
$ cd $HOME/apptainer
$ apptainer shell -B /gs -B /apps -B /home --nv -f -w ubuntu/
INFO: User not listed in /etc/subuid, trying root-mapped namespace
INFO: Using fakeroot command combined with root-mapped namespace
WARNING: nv files may not be bound with --writable
WARNING: Skipping mount /etc/localtime [binds]: /etc/localtime doesn't exist in container
WARNING: Skipping mount /bin/nvidia-smi [files]: /usr/bin/nvidia-smi doesn't exist in container
WARNING: Skipping mount /bin/nvidia-debugdump [files]: /usr/bin/nvidia-debugdump doesn't exist in container
WARNING: Skipping mount /bin/nvidia-persistenced [files]: /usr/bin/nvidia-persistenced doesn't exist in container
WARNING: Skipping mount /bin/nvidia-cuda-mps-control [files]: /usr/bin/nvidia-cuda-mps-control doesn't exist in container
WARNING: Skipping mount /bin/nvidia-cuda-mps-server [files]: /usr/bin/nvidia-cuda-mps-server doesn't exist in container
Apptainer> id
uid=0(root) gid=0(root) groups=0(root)
4.7.2.1. fakeroot利用時の留意事項について¶
Apptainer でフェイクルート機能(--fakeroot)を使用する場合、Apptainer はホスト側のfakerootをバインドマップして利用するためホストとコンテナの間でlibcのバージョンを一致させる必要があります。
ホストの libc ライブラリがコンテナー内の対応するライブラリよりも新しい場合、fakeroot コマンドは GLIBC バージョンが不足しているというエラーを出力する場合があります。( 参考:Fakeroot feature )
エラー出力例:
/.singularity.d/libs/faked: /lib/x86_64-linux-gnu/libc.so.6: version`GLIBC_2.33' not found (required by /.singularity.d/libs/faked)
/.singularity.d/libs/faked: /lib/x86_64-linux-gnu/libc.so.6: version`GLIBC_2.34' not found (required by /.singularity.d/libs/faked)
fakeroot: error while starting the `faked' daemon.
/.singularity.d/libs/fakeroot: 1: kill: Usage: kill [-s sigspec | -signum |-sigspec] [pid | job]... or
kill -l [exitstatus]