Skalieren von HPC-Anwendungen

Gilt für: ✔️ Linux-VMs ✔️ Windows-VMs ✔️ Flexible Skalierungsgruppen ✔️ Einheitliche Skalierungsgruppen

Um beim zentralen und horizontalen Skalieren von HPC-Anwendungen in Azure eine optimale Leistung zu erzielen, müssen für die betreffende Workload Experimente zur Leistungsoptimierung durchgeführt werden. In diesem Abschnitt sowie auf den spezifischen Seiten der jeweiligen VM-Serie finden Sie allgemeine Informationen zum Skalieren Ihrer Anwendungen.

Anwendungseinrichtung

Das azurehpc-Repository enthält viele Beispiele für:

Optimale MPI-Skalierung

Die folgenden Vorschläge dienen zur Optimierung der Skalierungseffizienz, Leistung und Konsistenz von Anwendungen:

  • Verwenden Sie für kleinere Skalierungsaufträge (< 256K-Verbindungen) Folgendes: UCX_TLS=rc,sm

  • Verwenden Sie für größere Skalierungsaufträge (> 256K-Verbindungen) Folgendes: UCX_TLS=dc,sm

  • Berechnen Sie die Anzahl der Verbindungen für Ihren MPI-Auftrag wie folgt: Max Connections = (processes per node) x (number of nodes per job) x (number of nodes per job)

Adaptives Routing

Adaptive Routing (AR) ermöglicht Azure Virtual Machines (VMs), die EDR- und HDR-InfiniBand ausführen, das automatische Erkennen und Vermeiden von Netzwerküberlastung indem dynamisch optimale Netzwerkpfade ausgewählt werden. Demzufolge bietet AR eine verbesserte Latenz und Bandbreite im InfiniBand-Netzwerk, das wiederum höhere Leistung und Skalierbarkeit ermöglicht. Weitere Informationen finden Sie im TechCommunity-Artikel.

Feste Prozesszuordnung

  • Ordnen Sie Prozesse Kernen mithilfe eines Ansatzes für sequenzielle Zuordnung zu (anstelle eines Ansatzes für einen automatischen Ausgleich).
  • Die Bindung nach NUMA/Kern/HW-Thread ist besser als die Standardbindung.
  • Verwenden Sie für hybride parallele Anwendungen (OpenMP+MPI) vier Threads und einen MPI-Rang pro [CCX] (Übersicht über VMs der HB-Serie mit Informationen zu CCXs) für HB- und HBv2-VM-Größen.
  • Experimentieren Sie bei reinen MPI-Anwendungen mit einem bis vier MPI-Rängen pro CCX auf VM-Größen der HB- und HBv2-Serien, um eine optimale Leistung zu erzielen.
  • Anwendungen, die in puncto Speicherbandbreite besonders empfindlich sind, profitieren ggf. von der Verwendung einer geringeren Anzahl von Kernen pro CCX. Bei diesen Anwendungen kann die Verwendung von drei oder zwei Kernen pro CCX die Konkurrenz um die Speicherbandbreite verringern und eine höhere Leistung in der Praxis oder eine konsistentere Skalierbarkeit ermöglichen. Von diesem Ansatz kann insbesondere MPI Allreduce profitieren.
  • Bei umfangreicheren Ausführungen empfiehlt sich die Verwendung von UD-Transporten oder Hybridtransporten (RC + UD). Diese Datentransporte werden von vielen MPI-/Runtimebibliotheken intern gehandhabt (beispielsweise bei UCX oder MVAPICH2). Überprüfen Sie Ihre Transportkonfigurationen für umfangreiche Ausführungen.

Kompilieren von Anwendungen


Zum Erweitern klicken

Anwendungen müssen zwar nicht unbedingt mit entsprechenden Optimierungsflags kompiliert werden, diese Vorgehensweise bietet jedoch die beste Leistung beim zentralen Hochskalieren von virtuellen Computern der HB- und HC-Serie.

AMD Optimizing C/C++ Compiler

Das AOCC-Compilersystem (AMD Optimizing C/C++ Compiler) zeichnet sich durch umfangreiche erweiterte Optimierungen, Multithreading und eine Prozessorunterstützung aus, die sowohl die globale Optimierung als auch Vektorisierung, prozessübergreifende Analysen, Schleifentransformationen und Codegenerierung umfasst. AOCC-Binärdateien eignen sich für Linux-Systeme mit der GNU C-Bibliothek (glibc) ab Version 2.17. Die Compilersuite besteht aus einem C/C++-Compiler (Clang), einem Fortran-Compiler (FLANG) und einem Fortran-Front-End für Clang (DragonEgg).

Clang

Clang ist ein C-, C++- und Objective-C-Compiler für die Verarbeitung, Analyse, Optimierung, Codegenerierung, Assembly und Verknüpfung. Clang unterstützt das Flag -march=znver1, um die bestmögliche Codegenerierung und Optimierung für die Zen-basierte x86-Architektur von AMD zu ermöglichen.

FLANG

Der FLANG-Compiler wurde der AOCC-Suite erst vor Kurzem (im April 2018) hinzugefügt und kann derzeit von Entwicklern als Vorabversion heruntergeladen und getestet werden. AMD erweitert die GitHub-Version von FLANG auf der Grundlage von Fortran 2008. Der FLANG-Compiler unterstützt alle Clang-Compileroptionen sowie zahlreiche FLANG-spezifische Compileroptionen.

DragonEgg

DragonEgg ist ein GCC-Plug-In, das die GCC-Optimierer und -Codegeneratoren durch Optimierer und Codegeneratoren aus dem LLVM-Projekt ersetzt. DragonEgg ist in AOCC enthalten. Das Plug-In kann mit gcc-4.8.x verwendet werden, wurde für Ziele vom Typ x86-32/x86-64 getestet und wird bereits erfolgreich auf verschiedenen Linux-Plattformen eingesetzt.

GFortran ist das eigentliche Front-End für Fortran-Programme und dient zur Vorverarbeitung und (semantischen) Analyse beim Generieren der GCC GIMPLE-IR (Intermediate Representation). DragonEgg ist ein GNU-Plug-In für den GFortran-Kompilierungsfluss. Es implementiert die GNU-Plug-In-API. Mit der Plug-In-Architektur wird DragonEgg zum Compilertreiber, der die verschiedenen Kompilierungsphasen steuert. Nach Ausführung der Download- und Installationsanweisungen kann DragonEgg wie folgt aufgerufen werden:

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-Compiler

Es wurde bestätigt, dass PGI Community Edition 17 mit AMD EPYC-Prozessoren funktioniert. Eine PGI-kompilierte Version von STREAM stellt die vollständige Speicherbandbreite der Plattform bereit. Die neuere Community Edition 18.10 (November 2018) sollte ebenso problemlos funktionieren. Verwenden Sie den folgenden CLI-Befehl, um mit dem Intel-Compiler zu kompilieren:

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

Intel-Compiler

Es wurde bestätigt, dass Intel Compiler 18 mit AMD EPYC-Prozessoren funktioniert. Verwenden Sie diesen CLI-Befehl, um mit dem Intel-Compiler zu kompilieren.

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

GCC-Compiler

Für HPC-Workloads empfiehlt AMD mindestens die Version 7.3 des GCC-Compilers. Ältere Versionen werden nicht empfohlen, z. B. die in RHEL 7.4 enthaltene Version 4.8.5. Mit GCC 7.3 und neueren Versionen wird bei HPL-, HPCG- und DGEMM-Tests eine höhere Leistung erzielt.

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

Nächste Schritte