Version 24.5
Release Notes原文
当ページは原文の意訳となっております。
1. 新機能について
NVIDIA HPC SDK 24.5へようこそ。NVIDIA HPC SDKは、CPU、GPU、インターコネクトといったHPCプラットフォーム全体のプログラム開発を可能にするコンパイラとライブラリの包括的パッケージです。HPC SDK 24.5のリリースは、コンポーネントのアップデートおよび重要な機能性やパフォーマンスの向上を含みます。
- 24.5 HPCコンパイラには、さまざまなメモリモードに対応したプログラミングを改善するために複数の機能が追加されました。詳細についてはドキュメントを参照してください。
- コンパイルおよびリンク時のメモリモードを制御するための、HPCコンパイラのコマンドラインインターフェースが更新されました:標準言語の並列処理、CUDA Fortran、OpenACCやOpenMPを使用する際の、セパレートメモリ、マネージドメモリとユニファイドメモリをサポートする新たなオプションが追加されました。
- HPCコンパイラは、コンパイル時とリンク時でGPUメモリモードが一致しない場合の診断を追加しました。これには、
unified_shared_memory
指定のOpenMP requiresディレクティブの利用が含まれます。プログラムが互換性のない異なるメモリモードオプションでリンクされると、診断が発行されます。
- コンパイルターゲットがGPUに設定されている場合、nvfortranは単一の翻訳単位内のDO CONCURRENTループから呼び出されるルーチンを推論し、明示的なデバイスルーチンのアノテーションを必要とせずにそれらをGPU用にコンパイルします。詳細はドキュメントを参照してください。
- HPCコンパイラは、
-nvmalloc
オプションを実装しました。このオプションによって、断片化の回避とスケーラブルな並行性のサポートを重視した汎用的なメモリ割り当てを実装できます。この機能はjemallocメモリアロケーターに基づいており、x86 CPUおよびNVIDIA Grace Arm CPU向けに調整されています。有効化されると、mallocや関連するメモリ割り当て関数を置き換えます。 - NVPLはHPC SDK 24.5で24.03-betaに更新されました。詳細についてはNVIDIA Performance Librariesを参照してください。
- この更新により、NVPLのTensor、ScaLAPACKとBLACSライブラリが利用可能になりました。
- HPCコンパイラとの統合を改善するために、
-Mnvpl
フラグが改良されました: - サブオプションを指定しない場合、リンカーによって必要に応じてすべてのNVPLライブラリがアプリケーションにリンクされます。
- ユーザーは、リンクするNVPLライブラリのリストを指定することによって、デフォルト動作を上書きすることができます。例:
-Mnvpl=blas
,lapack
,fft
,rand
-Mscalapack
が指定されない限り、-Mnvpl
はNVPL ScaLAPACKを含みません。-Mscalapack
フラグも強化されました。-i8
と指定された場合、ilp64バージョンのScaLAPACKライブラリがリンクされるようになりました。-Mnvpl
と共に-Mscalapack
が指定されると、NVPL ScaLAPACKが使用されます。-Mnvpl
を指定しない-Mscalapack
は、これまで通りNetlib ScaLAPACKを使用します。
__int128
ABIはX86向けに更新され、i128
を2つのレジスタ内に正しく渡すようになりました。レジスタが使用できない場合には、16バイトのスタックスロット内にi128を正しく渡すようになりました。これはx86_64 SysV ABI仕様に一致します。i128
を渡すオブジェクトファイルは再コンパイルする必要があります。nvcpuid
は、/proc/cpuinfo
にリストされているLinuxカーネルの名前と機能を使用するようになりました。- HPC SDKバージョン24.5は、CUDA 12.4および11.8を搭載しています。
2. リリースに含まれる各コンポーネントのバージョン
各コンポーネントについて、バージョン番号が記載されております。
各バージョンについて詳細を確認したい場合は原文の表をご確認ください。
3. サポートされるプラットフォーム
3.1. プラットフォーム要件
Linuxディストリビューション、gcc/glibcの最低バージョン、CUDAドライバの最低バージョンが記載されております。
詳細は原文の表をご確認ください。
3.2. サポートされるCUDA Toolkitのバージョン
NVIDIA HPC SDKは、NVIDIA GPUを用いたプログラムをビルドする場合にCUDA Toolchainの機能を使用します。すべてのNVIDIA HPC SDKは、必要なCUDAコンポーネントをインストールディレクトリにインストールします。インストール先のパスは [install-prefix]/[arch]/[nvhpc-version]/cuda
です。
GPU用にコンパイルされたプログラムを実行するためには、GPU搭載システムにNVIDIA CUDA GPUデバイスドライバのインストールが必要です。
NVIDIA HPC SDKにはCUDAドライバは含まれませんので、適切なCUDAドライバをNVIDIAからダウンロードする必要があります。
システムにインストールされたCUDAドライバのバージョンを確認するためにnvaccelinfo
コマンドが利用できます。
NVIDIA HPC SDK 24.5は以下のtoolchainを含みます。
- CUDA 11.8
- CUDA 12.4
4. 制限事項
- ポインタがtarget属性を持つ配列仮引数に割り当てられると、nvfortranは実引数ではなく、配列引数のコピーにポインタを関連付ける場合があります。
- HPC-Xを使用する場合、非常に短時間で終了するMPIジョブの起動オーバーヘッドが大きくなる可能性があります。ワークアラウンドとして、環境変数
UCX_VFS_ENABLE=n
を設定することができます。 - 一部のシステムでは、UCXが
/proc/self/map
情報の解析中に失敗することがあり、次のトレースでクラッシュします: “sys.c:194 UCX FATAL failed to allocate maps buffer(size=32768)” 。この問題を回避するには、UCX_MEM_EVENTS=n
環境変数を設定してください。 - NVPL FFTはオリジナルのOpenMPスレッドアフィニティマスクを尊重します。OpenMPランタイムと共にビルドされたアプリケーションに対して、(
OMP_PROC_BIND
かOMP_PLACES
のどちらか一方を通じた)スレッドアフィニティの制御は、マルチスレッド性能に悪影響を及ぼす可能性があります。性能改善のため、利用者はその2つのOpenMP環境変数の設定を解除するか、OMP_PROC_BINDをfalseに設定することが推奨されます。さらなるNVPLに関連した既知の問題は、NVPL documentation内に記述されています。 comm_libs/mpi/bin
のMPIラッパーは、CUDAドライバーを自動的に検出し、comm_libs/X.Y
から一致するMPI ライブラリを選択します。完全なMPI ディレクトリ階層 (例えば、bin、include、lib) が必要なアプリケーション、または srun 経由で起動されるアプリケーションは、インストールされているCUDAドライバーのバージョンに応じて、nvhpc-hpcx-cuda11
あるいはnvhpc-hpcx-cuda12
のenvironmentモジュールをロードして、MPI ラッパーをバイパスする必要があります。- Fortranサブプログラムへの内部手続きの実引数としての受け渡しは、仮引数がインターフェイスブロックや手続き仮引数として宣言された場合、nvfortranによってサポートされます。nvfortranは、外部で宣言された仮引数へ、内部手続きを実引数として受け渡すことをサポートしません。
- nvfortranは、Fortran2003標準の最大7次元の配列(Fortran2008は標準の最大次元を15に引き上げた)のみをサポートします。この制限は、CヘッダーファイルISO_Fortran_binding.h内の標準的なCFI_MAX_RANKマクロの中で定義されます。
- Fortran 2018 Standard内の「15.5.2.4 Ordinary dummy variables」の章、constraint C1540とNote 5において、実引数または対応する仮引数がASYNCHRONOUS/VOLATILE属性を持ち、かつ仮引数がVALUE属性を持たないという条件では、Fortranコンパイラにcopy-in/copy-outの引数受け渡しの回避を認めます。この性質は、nvfortran内のBIND(C)インターフェイス(すなわち、Cを呼び出すFortran)で完全にサポートされます。asynchronous/volatile属性のcopy-in/copy-out回避は、他の場合ではnvfortranで利用できない可能性があります。
- MKLバージョン2023.1.0を使用するHaswellやBroadwell上で、OpenMPスレッド数が4以上の特定のワークロードの実行時に、一部のアプリケーションで不具合が発生する可能性があります。その問題はMKLバージョン2023.2.0で解決されました。
- cuSolverMpは、HPC-Xディレクトリ内のUCCとUCXライブラリの2つの依存関係を持ちます。cuSolverMpを利用するプログラムを実行する場合、HPC-Xライブラリを含む
nvhpc-hpcx-cuda 11
environment moduleをご利用ください。または、環境変数LD_LIBRARY_PATHを以下のように設定してください。$ LD_LIBRARY_PATH=${NVHPCSDK_HOME}/comm_libs/hpcx/latest/ucc/lib:${NVHPCSDK_HOME}/comm_libs/11.8/hpcx/latest/ucx/lib:$LD_LIBRARY_PATH - HPC-Xを利用するためには、提供された環境モジュールファイルをご利用ください。または、hpcx-init.shスクリプトの実行にご注意ください:
$ . ${NVHPCSDK_HOME}/comm_libs/X.Y/hpcx/latest/hpcx-init.sh
その後、hpcx_loadを実行してください。
$ hpcx_loadこれらの作業により、HPC-Xを利用するために必要な重要な環境変数が設定されます。また、もしMPIジョブを実行中にHPC-Xの以下の警告メッセージが表示された場合には、性能が低下するかもしれませんが、実行は継続され警告のみです。
WARNING: Open MPI tried to bind a process but failed.
これは既知の問題で、以下のように対処することができます。$ export OMPI_MCA_hwloc_base_binding_policy="" - HPC-Xは、2.17.1バージョン時点で、ストリームで順序付けられCUDAでアロケートされたメモリの性能最適なサポートしません。実用の観点から、それは次のことを意味します:通信データが
cudaMallocAsync
関数や類似の関数と共にアロケートされる時、MPIコールMPI_Send
とMPI_Recv
のようなIPCが、スループットを非常に劣化させることがあります。この制限は、将来リリースされるHPC-Xで削除される予定です。 - sourced allocationまたはallocatable assignmentで利用される、サイズが0の派生タイプallocatable componentを持つFortran派生タイプオブジェクトは、セグメント違反が発生する可能性があります。
- C++の並列アルゴリズムを高速化するために
-stdpar
を利用する場合、アルゴリズムの呼び出しは、仮想関数呼び出しや、関数ポインタによる関数呼び出し、C++例外を含むことができません。ランダムアクセスイテレータを利用する必要があります(通常のポインタをイテレータとするのが最善です)。Unified memoryが無効な場合、アルゴリズムの呼び出しは、ヒープを指すデリファレンスポインタのみを利用できます。詳細はc++ parallel algorithms documentationを参照ください。
5. 廃止事項
- HPC SDKにおいて、Power CPUアーキテクチャのサポートが中止になりました。
- HPC SDKバージョン24.9では、Amazon Linux 2とRHEL 7ベースのオペレーティングシステムへのサポートが削除されます。これは、アップストリームのエンドオブライフ(EOL)に対応しています。
- nvc++、nvcc、および nvfortran の
-Mllvm
コマンドラインオプションは、サポートされなくなりました。 - ANSIモード(例えば、
-std=c++17
や-std=c99
)の場合、GNU拡張マクロlinux
とunix
は定義されなくなりました。コードがANSIモードでコンパイルされ、かつこれらのマクロに依存する場合は、ANSI準拠マクロ__linux__
や__unix__
を使う必要があります。 - Arm (aarch64)のみ:
nvfortranバージョン23.9では、Fortran複素関数のcalling/return手順を、GNUのgfortranの規約と合致するように変更します。23.9以前では、関数は「隠れた」ポインタを最初のパラメータとして使い、stackを通して複素数値を返しました。現在は、浮動小数点レジスターを通して、gfortranの規約に従って複素数値が返されます。NVIDIA HPC SDK のArmの全ライブラリは“gfortran’’の方法に従うようにアップデートされました。Armのパフォーマンスライブラリを利用する場合、“arm’’バージョンの代わりに“gcc’’バージョンを使う必要があります。Armシステムでnvfortranを使う場合、複素数型を利用するすべてのFortranコードは、ライブラリを含め、再コンパイルする必要があります。 - CUDA Fortran textureのサポートはCUDA 11.0と11.8で非推奨となり、CUDA 12で削除されました。23.9のリリースは、CUDA Fortran textureのサポートを含むHPCコンパイラの最後のバージョンです。
- OpenMPI 3, 4ライブラリは、今後のリリースでHPC SDKから削除される予定です。
-Minfo=intensity
オプションはサポートされなくなりました。CUDA_HOME
環境変数はHPCコンパイラに無視されます。NVHPC_CUDA_HOME
を利用してください。- HPCコンパイラ23.3から
-Mipa
オプションが無効になりました。 - HPCコンパイラの
-ta=tesla
,-Mcuda
,-Mcudalib
オプションは非推奨となりました。 - NVIDIA HPC SDKの23.11 から、CUDA 11.8 と CUDA 12.x シリーズの最新バージョンのみがバンドルされています。11.0 より古い CUDA バージョンをサポートする HPC コンパイラ内のコードパスは検査や保守管理されなくなりました。
- CUDA Fortranの
cudaDeviceSynchronize()
は非推奨となり、デバイスコードから削除されました。ホストコード内ではサポートされます。 - NVIDIA HPC SDK 21.5から、NVC++とNVFORTRANの
-cuda
オプションは、NVIDIA GPU数学ライブラリを自動的にリンクしません。-cudalib
オプションを参照ください。 - NVIDIA HPC SDK 21.3から、NVIDIA GPUのKeplerアーキテクチャのHPCコンパイラサポートが廃止されました。