HPC アプリケーションのスケール

適用対象: ✔️ Linux VM ✔️ Windows VM ✔️ フレキシブル スケール セット ✔️ 均一スケール セット

Azure 上の HPC アプリケーションの最適なスケールアップとスケールアウトのパフォーマンスには、特定のワークロードに対するパフォーマンスの調整と最適化の実験が必要です。 このセクションと VM シリーズ固有のページでは、アプリケーションをスケールするための一般的なガイダンスについて説明します。

アプリケーションのセットアップ

azurehpc リポジトリには、次のような多くの例が含まれています。

MPI を最適にスケールする

次の提案は、最適なアプリケーションのスケーリング効率、パフォーマンス、および整合性に適用されます。

  • 小規模なジョブ (接続数が 256K 未満) の場合は次を使用します: UCX_TLS=rc,sm

  • 大規模なジョブ (接続数が 256K 以上) の場合は次を使用します: UCX_TLS=dc,sm

  • MPI ジョブの接続数を計算するには次を使用します: Max Connections = (processes per node) x (number of nodes per job) x (number of nodes per job)

アダプティブ ルーティング

アダプティブ ルーティング (AR) を使用すると、EDR と HDR InfiniBand を実行している Azure Virtual Machines (VM) で、最適なネットワーク パスを動的に選択し、ネットワークの輻輳を自動的に検出して回避することができます。 その結果、AR によって InfiniBand ネットワーク上の待機時間と帯域幅が改善され、パフォーマンスとスケーリングの効率が向上します。 詳細については、TechCommunity の記事を参照してください。

プロセスの固定

  • (自動バランス アプローチとは対照的に) シーケンシャルなピン留めアプローチを使用して、コアにプロセスをピン留めします。
  • Numa/Core/HwThread によるバインディングは、既定のバインディングよりも優れています。
  • ハイブリッド並列アプリケーション (OpenMP + MPI) の場合は、HB および HBv2 VM のサイズで、[CCX] あたり 4 つのスレッドと 1 つの MPI ランクを使用します (CCX に関する情報を含む HB シリーズ仮想マシンの概要に関するページ)。
  • 純粋な MPI アプリケーションの場合は、HB および HBv2 の VM サイズで最適なパフォーマンスを得るために、CCX ごとに 1 つから 4 つの MPI ランクで実験します。
  • メモリ帯域幅の影響を非常に受けやすいアプリケーションでは、CCX あたりのコア数を減らしてメリットが得られる場合があります。 これらのアプリケーションでは、CCX あたり 3 コアまたは 2 コアを使用してメモリ帯域幅の競合を減らし、実際の環境でより高いパフォーマンスや、より一貫したスケーラビリティを実現できます。 特に MPI "Allreduce" では、このアプローチのメリットがある可能性があります。
  • 大規模な実行の場合、UD またはハイブリッド RC + UD トランスポートを使用することをお勧めします。 多くの MPI ライブラリまたはランタイム ライブラリでは、これらの転送が内部的に使用されます (UCX や MVAPICH2 など)。 大規模な実行の場合は、トランスポート構成を確認します。

アプリケーションのコンパイル


展開するにはクリック

必須ではありませんが、適切な最適化フラグを使用してアプリケーションをコンパイルすると、HB および HC シリーズの VM で最高のスケールアップ パフォーマンスを達成できます。

AMD Optimizing C/C++ Compiler

AMD Optimizing C/C++ Compiler (AOCC) コンパイラ システムは、グローバルな最適化、ベクトル化、プロシージャ間の分析、ループ変換、コード生成を含む高度な最適化、マルチスレッド、およびプロセッサのサポートを提供しています。 AOCC コンパイラ バイナリは、GNU C ライブラリ (glibc) バージョン 2.17 以降がインストールされた Linux システムに適しています。 コンパイラ スイートは、C/C++ コンパイラ (clang)、Fortran コンパイラ (FLANG)、および Clang への Fortran フロント エンド (Dragon Egg) で構成されています。

Clang

Clang は、前処理、解析、最適化、コード生成、アセンブリ、およびリンクを処理する C、C++、および Objective-C のコンパイラです。 Clang では、AMD の Zen ベースの x86 アーキテクチャに最適なコード生成と調整を行うことができる -march=znver1 フラグがサポートされています。

FLANG

FLANG コンパイラは、AOCC スイートに最近 (2018 年 4 月) 追加されたもので、現在は開発者がダウンロードしてテストするためのプレリリース段階です。 AMD では Fortran 2008 に基づいて GitHub バージョンの FLANG が拡張されます。 FLANG コンパイラは、すべての Clang コンパイラ オプションとその他の FLANG 固有のコンパイラ オプションをサポートしています。

DragonEgg

DragonEgg は、GCC のオプティマイザーと LLVM プロジェクトからのコード ジェネレーターを置き換える gcc プラグインです。 AOCC に付属する DragonEgg は gcc-4.8.x で動作し、x86-32 および x86-64 ターゲット向けにテストされており、さまざまな Linux プラットフォームで正常に使用されています。

GFortran は、GCC GIMPLE 中間表現 (IR) を生成する前処理、解析、およびセマンティック分析を担当する Fortran プログラムの実際のフロントエンドです。 DragonEgg は、GFortran コンパイル フローにプラグインする GNU プラグインです。 これには GNU プラグイン API が実装されています。 このプラグイン アーキテクチャでは、DragonEgg がコンパイラ ドライバーになり、コンパイルのさまざまな段階が推進されます。 ダウンロードとインストールの手順を実行した後は、次を使用して Dragon Egg を呼び出すことができます。

gfortran [gFortran flags]
   -fplugin=/path/AOCC-1.2-Compiler/AOCC-1.2-
   FortranPlugin/dragonegg.so [plugin optimization flags]
   -c xyz.f90 $ clang -O3 -lgfortran -o xyz xyz.o $./xyz

PGI コンパイラ

PGI Community Edition 17 は、AMD EPYC と連携して動作することが確認されています。 PGI コンパイル バージョンの STREAM は、プラットフォームの全メモリ帯域幅を提供します。 新しい Community Edition 18.10 (2018 年 11 月) も同様に機能するはずです。 次の CLI コマンドを使用して Intel コンパイラでコンパイルします。

pgcc $(OPTIMIZATIONS_PGI) $(STACK) -DSTREAM_ARRAY_SIZE=800000000 stream.c -o stream.pgi

Intel コンパイラ

Intel Compiler 18 は、AMD EPYC で動作することが確認されています。 次の CLI コマンドを使用して Intel コンパイラでコンパイルします。

icc -o stream.intel stream.c -DSTATIC -DSTREAM_ARRAY_SIZE=800000000 -mcmodel=large -shared-intel -Ofast –qopenmp

GCC コンパイラ

HPC ワークロードの場合、AMD は GCC コンパイラ 7.3 以降を推奨しています。 RHEL 7.4 に含まれる 4.8.5 などの古いバージョンは推奨されません。 GCC 7.3 以降は、HPL、HPCG、DGEMM テストで高いパフォーマンスを発揮します。

gcc $(OPTIMIZATIONS) $(OMP) $(STACK) $(STREAM_PARAMETERS) stream.c -o stream.gcc

次のステップ