GROMACS mit Grafikprozessorbeschleunigung

Anleitung für grafikprozessorfähige Anwendungen lesen und direkt beginnen

GROMACS

GROMACS ist ein Programm für molekulardynamische Berechnungen und wird zur Simulation newtonscher Bewegungsgleichungen für Systeme von einigen Hunderten bis zu Millionen Partikeln benutzt. Hierzu zählen biochemische Proteine, Lipide und Nukleinsäuren mit vielen komplizierten und in Wechselwirkungen stehenden Interaktionen.

GROMACS läuft auf mit NVIDIA-Grafikprozessoren beschleunigten Systemen bis zu 3-mal schneller als auf rein CPU-basierten Systemen.* Dadurch lassen sich Molekulardynamiksimulationen innerhalb weniger Stunden anstatt mehrerer Tage durchführen.

GROMACS läuft auf mit NVIDIA-Grafikprozessoren beschleunigten Systemen bis zu 3-mal schneller.

Installation

GROMACS (Version 5.1.2) kann von der GROMACS-Website heruntergeladen werden. Ersetzen Sie „VERSION“ in den folgenden Befehlszeilenbeispielen durch „5.1.2“ bzw. die GROMACS-Version, die Sie verwenden möchten. Mittlerweile wurde Version 5.1.4 veröffentlicht, deren Leistung nachweislich höher als die von Version 5.1.2 ist.

Download‑ und Installationsanleitung

Um die grafikprozessorbeschleunigte Version zu konfigurieren (mit CMake) und zu erstellen, ist folgende Software erforderlich:

  • CMake
  • NVIDIA CUDA®*
  • GCC*
  • MPI (Optional. Verwenden Sie MPI, wenn die Version mit mehreren Knoten erforderlich ist).

* Es wird empfohlen, eine aktuelle CUDA-Version (derzeit 7.5) sowie die aktuelle, von der entsprechenden CUDA-Version unterstützte gcc-Version zu verwenden.

$ wget ftp://ftp.gromacs.org/pub/gromacs/gromacs-VERSION.tar.gz
$ tar -xzvf gromacs-VERSION.tar.gz
$ mkdir gromacs-VERSION-build
$ cd gromacs-VERSION-build
$ CC=gcc CXX=g++ cmake <GROMACS_SRC_DIR> -DGMX_OPENMP=ON -DGMX_GPU=ON -
DGPU_DEPLOYMENT_KIT_ROOT_DIR=<GDK_PATH> -DGMX_BUILD_OWN_FFTW=ON -
DGMX_PREFER_STATIC_LIBS=ON -DCMAKE_BUILD_TYPE=Release -
DCMAKE_INSTALL_PREFIX=<GROMACS_INSTALL_DIR>

CMAKE (CROSS PLATFORM MAKE)-OPTIONEN

Ersetzen Sie durch den Pfad zum GROMACS-Quellverzeichnis, z. B. ../gromacs-5.1.2. ist der Pfad, unter dem das GPU Deployment Kit installiert ist.

Die Grafikprozessortaktraten in GROMACS 5.1 können via NVML automatisch für optimale Leistung angepasst werden. Für die optionale NVML-Unterstützung ist das  GPU Deployment Kit  (GDK) erforderlich.

Ersetzen Sie nach dem Download und der Installation durch den Pfad des gdk-Verzeichnisses. (Sie können die Option -DGPU_DEPLOYMENT_KIT_ROOT_DIR= entfernen, wenn Sie das GDK im Standardverzeichnis installieren.) muss ebenfalls durch den gewünschten Installationspfad ersetzt werden, z. B. /opt/gromacs.

Verschiedene andere Konfigurationen werden hier mithilfe der CMake-Optionen vorgenommen, z. B. die Aktivierung der OpenMP-Unterstützung anhand von -DGMX_OPENMP=ON. Mit der Konfigurationsoption -DGMX_BUILD_OWN_FFTW=ON wird FFTW heruntergeladen und bei der GROMACS-Erstellung implementiert. So wird sichergestellt, dass die richtigen Optimierungskennzeichnungen für FFTW ausgewählt werden. Alternativ kann eine entsprechende FFTW-Installation verwendet werden. Weitere Informationen hierzu finden Sie in der GROMACS-Installationsanleitung im Abschnitt  FFTW.  Detaillierte Informationen zu den einzelnen Optionen entnehmen Sie dem  GROMACS-Handbuch.

GROMACS mit MPI

Um GROMACS mit MPI-Unterstützung zu erstellen und zu installieren, müssen Sie den vorherigen Befehl um den folgenden Zusatz erweitern: -DGMX_MPI=ON

$ CC=mpicc CXX=mpicxx cmake <GROMACS_SRC_DIR> -DGMX_OPENMP=ON -DGMX_GPU=ON
-DGPU_DEPLOYMENT_KIT_ROOT_DIR=<GDK_PATH> -DGMX_MPI=ON -DGMX_BUILD_OWN_FFTW=ON -DGMX_PREFER_STATIC_LIBS=ON -
DCMAKE_BUILD_TYPE=Release -DGMX_BUILD_UNITTESTS=ON -DCMAKE_INSTALL_PREFIX=<GROMACS_INSTALL_DIR>

ERSTELLEN UND INSTALLIEREN

Um GROMACS zu erstellen und zu installieren, verwenden Sie den folgenden Befehl:

$ make
$ sudo make install

Um die ordnungsgemäße Funktion von GROMACS nach der Installation zu überprüfen, fügen Sie dem Konfigurationsbefehl die Option -DREGRESSIONTEST_DOWNLOAD=ON hinzu und führen Sie vor „make install“ den Befehl „make check“ aus. Um das Verfahren zu beschleunigen, können Sie auch „make -jN“ verwenden, wobei N der Anzahl der Kerne Ihrer Plattform entspricht.

Zusätzliche Informationen zu den Installationsoptionen entnehmen Sie der GROMACS-Installationsanleitung.

Befehlsausführung

GROMACS enthält Skripte zur Einrichtung der Umgebung für unterschiedliche Shells. Um den PFAD und andere Umgebungen einzurichten, verwenden Sie den folgenden Befehl.

    $ source <GROMACS_INSTALL_DIR>/bin/GMXRC

Wenn Sie sowohl MPI- als auch Nicht-MPI-Binärdateien wie zuvor beschrieben erstellen, enthält das bin-Verzeichnis der Installation sowohl „gmx“ also auch „gmx_mpi“. Für die in dieser Anleitung beschriebenen Beispiele werden die „water“-Datensätze vom  GROMACS-ftp verwendet. Zur Ausführung von GROMACS mit diesen Datensätzen muss zunächst der im Folgenden beschriebene Schritt zur Datenvorbereitung ausgeführt werden. Zusätzliche Details/Optionen zur Vorbereitung der Eingaben bei der Ausführung von GROMACS finden Sie hier.

Zur Ausführung von GROMACS sind zwei Schritte erforderlich:

Schritt 1: Eingabedaten mit grompp (GROMACS-Präprozessor) vorbereiten 

a) Bei Verwendung der Einzelknotenversion: $ gmx grompp -f

Schritt 2: „mdrun“ starten

a) Bei Verwendung der Einzelknotenversion: $ gmx mdrun 
b) Bei Verwendung der MPI-Version: (np = #GPUs): $ mpirun –np gmx_mpi mdrun

Für eine geringe Anzahl von Knoten bieten diese Einstellungen normalerweise gute Leistung. Die Simulationsleistung von GROMACS lässt sich normalerweise jedoch durch einige Anpassungen noch verbessern. Diese manuellen Leistungsoptimierungen sind relevant, wenn eine größere Anzahl an Knoten verwendet wird. Weitere Informationen entnehmen Sie dem GROMACS-Handbuch , der gmx-Benutzer-E-Mail-Liste und der veröffentlichten Dokumentation.

Die Optionen zur Optimierung der Grafikprozessorleistung werden in diesem Dokument beschrieben. Eingabedaten für Benchmark-Leistungstests können heruntergeladen werden.

BENCHMARK-AUSFÜHRUNGSOPTIONEN

Verwenden Sie bei der Ausführung von GROMACS-Benchmarks die folgenden Befehlszeilenoptionen, um die Leistung zu messen:

1. –resethway: Beim Start der einzelnen Simulationen stimmt GROMACS die Domainzerlegung ab und führt einen Lastenausgleich zwischen den verfügbaren CPUs und GPUs durch. Hierdurch werden die ersten Iterationen (einige Hundert) verlangsamt. Da die Ausführung echter Simulationen sehr lange laufen, hat dies keinen Einfluss auf die erreichte Leistung. Um die erforderliche Laufzeit zur Erzielung zuverlässiger Ergebnisse beim Benchmarking zu minimieren, sollte die Option „–resethway“ angegeben werden. Mit „-resethway“ werden alle Leistungszähler zurückgesetzt, sobald die Hälfte der Iterationen ausgeführt wurde. So kann die Leistung ohne viele Zeitschritte realistisch gemessen werden. Wenn die Zähler zurückgesetzt werden, während der PME-Lastenausgleich zu Beginn der Ausführung noch aktiv ist, wird möglicherweise eine Fehlermeldung ausgegeben (sinngemäß: „Die PME-Leistungsoptimierung war bei Zurücksetzung der mdrun-Zähler bei Schritt xxxxxxx noch aktiv.“). Um dies zu vermeiden, können Sie die Laufzeitschritte erhöhen, indem Sie den verwendeten Parameter „-maxh“ erhöhen oder „-nsteps“ hinzufügen, um die Anzahl der Zeitschritte der Simulation zu erhöhen.

2. -maxh: Gibt die maximale Dauer der Ausführung der Simulation an. „mdrun“ führt genügend Zeitschritte aus, um mindestens den angegebenen Zeitraum in Stunden zu simulieren. Der festgelegte Wert muss hoch genug sein, um zuverlässige Leistungsergebnisse erzielen zu können. Ein angemessener Wert wäre z. B. 5 Minuten = 0,08333. Verwenden Sie entweder diese oder die im Folgenden beschriebene Option „nsteps“, um die Laufzeit der Simulation zu begrenzen.

3. –noconfout: Hiermit wird die Ausgabe von confout.gro deaktiviert, was viel Zeit in Anspruch nehmen kann, z. B. in parallelen Dateisystemen. Da dies bei echten Simulationen sehr selten erfolgt, sollte die Option beim Benchmarking deaktiviert werden.

4. –v: Gibt weitere Informationen über die Befehlszeile und die Protokolldatei „md.log“ aus. Die enthaltenen Informationen sind sehr hilfreich, wenn Sie die Leistung von GROMACS optimieren möchten.

5. –nb: Mit diesem Befehl verwendet GROMACS entweder „gpu“ oder „cpu“ für bestimmte Berechnungen.

6. –nsteps: Die Anzahl der auszuführenden Zeitschritte. Der Standardwert in der mdp-Datei wird dadurch überschrieben. Diese Option kann zudem anstelle von „maxh“ verwendet werden, um die Gesamtdauer einer Simulation zu konfigurieren.

Die Leistung wird am Ende der erstellten Protokolldatei (md.log) sowie bei der Konsolenausgabe in ns/Tag (je höher der Wert, desto besser) angegeben. 

Auf der Dokumentationsseite  von GROMACS finden Sie zusätzliche Informationen zu den Befehlszeilenparametern.

LEISTUNGSOPTIMIERUNG

Um das Leistungsverhalten von GROMACS richtig zu verstehen, sollten Sie ein grundlegendes Verständnis der Aufgaben haben, die GROMACS ausführt. Im Folgenden sind diese vereinfacht Dargestellt. Grob gesagt führt GROMACS vier Aufgaben aus:

1. PP: Berechnung von Kräften ohne Wechselwirkung mit begrenzter Reichweite oder Partikel-Partikel (PP)-Interaktionen (prozessorgebunden, nur Kommunikation zum nächsten Nachbar)

2. PME: Berechnung der Langreichweiten-Kräfte-Näherung für ungebundene Atome (kommunikationsintensiv bei Ausführungen auf mehreren Knoten)

3. Gebunden (B): Berechnung von Kräften mit Wechselwirkung

4. Sonstige: Erzwingen konstanter Bindungsabstände, Aktualisierung der Atompositionen, Berechnung der Nächste-Nachbarlisten und mehr.

Bei der Grafikprozessorkonfiguration von GROMACS wird die zeitaufwändigste Aufgabe – PP – auf dem Grafikprozessor beschleunigt, während die drei anderen Aufgaben („PME“, „Gebunden“ und „Sonstige“) nur auf der CPU ausgeführt werden können. Die Aufgabe vom Typ „PP“ ist unabhängig von den Aufgaben „Gebunden“ und „PME“ und kann gleichzeitig ausgeführt werden, während die Aufgabe vom Typ „Sonstige“ größtenteils von der Ausgabe von „PP“, „PME“ und „Gebunden“ abhängt. Bei der Grafikprozessorkonfiguration werden die Aufgaben vom Typ „PME“ und „Gebunden“ daher auf der CPU ausgeführt, während der Grafikprozessor die Aufgabe vom Typ „PP“ ausführt:

GROMACS lagert rechenintensive PP-Aufgaben auf die Grafikprozessoren aus.

Durch Anpassen des Abschneideparameters für Elektrostatik (Abstand, ab dem die Langreichweiten-Beschreibung für Kräfte genutzt wird) kann GROMACS die Arbeitslast von der CPU (PME-Teil) an den Grafikprozessor (PP-Teil) übertragen werden (standardmäßig aktiv; deaktivierbar per Befehlszeilenoption „–tunepme“). In umgekehrter Reihenfolge ist der Vorgang aufgrund von numerischen Genauigkeitsbeschränkungen nicht möglich. Beispiel: Wenn der Grafikprozessor die PP-Aufgabe schneller als die CPU ausführt (siehe Abbildung unten), lagert GROMACS die Arbeitsauslastung von der CPU zum Grafikprozessor um, was zu einer kürzeren Anwendungslaufzeit führt.

GROMACS verlagert Workloads auf die Grafikprozessoren, um Simulationen zu beschleunigen.

Die PP-Aufgabe hat eine Komplexität von O(m*n), die PME-Aufgabe von O(n log(n)), wobei n der Anzahl der Partikel und m der Größe der Nachbarliste entspricht. Typische Werte für m sind 200–400, also viel kleinere Werte als für n.

Die folgenden Einstellungen können zur Optimierung der Leistung von GROMACS verwendet werden.

STARTKONFIGURATION

GROMACS verwendet MPI und OpenMP, um alle verfügbaren Grafikprozessor- und CPU-Ressourcen in einem Cluster nutzen zu können. Die optimale Startkonfiguration hängt von den jeweiligen Eingabedaten und den Möglichkeiten des Netzwerks ab. Diese reichen von einem MPI-Prozess pro logischem Kern mit jeweils einem OpenMP-Thread bis zu einem MPI-Prozess pro Knoten, der alle verfügbaren Kerne in diesem Knoten nutzt. Zur Ermittlung der optimalen Startkonfiguration sind folgende Richtlinien hilfreich:

  • Bei Verwendung eines einzelnen (oder manchmal doppelten) CPU-Sockels ist OpenMP-Parallelisierung normalerweise effizienter als MPI.
  • Werden mehrere CPU-Sockel oder -Knoten verwendet, ist eine Hybrid-Parallelisierung mit MPI- und OpenMP und 2–4 OpenMP-Threads pro MPI-Rank normalerweise effizienter als die alleinige Verwendung von MPI.
  • Bei einer großen Anzahl von Knoten kann es von Vorteil sein, mehr OpenMP-Threads pro MPI-Rank zu verwenden, um den Umfang der erforderlichen Kommunikation zu reduzieren. Die für die Kommunikation aufgewendete Zeit ist in der Ausgabedatei md.log angegeben (siehe „Skript 1 – für Kommunikation aufgewendete Zeit in md.log“).
Computing: Num Ranks Num Threads Call Count Wall time (s) Giga-Cycles total sum %
[…]
Comm. coord. 2 10 252681 63.467 3808.202 3.6
[…]
Comm. energies. 2 10 25917 1.108 66.457 0.1
Total 1782.537 106957.655 100.0
Breakdown of PME mesh computation
[…]
PME 3D-FFT Comm. 2 10 518322 126.829 7610.103 7.1
[…]

Skript 1 – für Kommunikation aufgewendete Zeit in md.log

Für die MPI-Version kann die Anzahl der MPI-Ranks mit dem Startprogramm der verwendeten MPI-Implementierung (Parameter „-np“) gesteuert werden. Die Anzahl der OpenMP-Threads kann mit der mdrun-Befehlszeilenoption „–ntomp“ oder der Umgebungsvariable OMP_NUM_THREADS gesteuert werden. Die Einzelknotenversion von mdrun verwendet Thread-MPI (eine interne, Threading-basierte MPI-Implementierung) und OpenMP. Für diese Version kann die Anzahl der OpenMP-Threads ebenfalls mit der Befehlszeilenoption „–ntomp“ gesteuert werden. Die Anzahl der MPI-Ranks kann mit „–ntmpi“ gesteuert werden. Für die grafikprozessorbeschleunigte Version von GROMACS ist mindestens ein MPI-Rank pro Grafikprozessor erforderlich, um alle verfügbaren Grafikprozessoren zu nutzen.

THREAD-/PROZESSBINDUNG

OpenMP-Thread- und MPI-Prozesse in GROMACS müssen korrekt an die Kerne/Threads des Systems gebunden werden. Dies kann entweder mit dem verwendeten mpi-Startprogramm/Batch-System oder durch GROMACS erfolgen. Standardmäßig versucht GROMACS automatisch, die Threads zu binden. Wenn einige Bindungen allerdings bereits vom MPI-Startprogramm durchgeführt wurden, entspricht die OpenMP-Implementierung bzw. die Anzahl der verfügbaren logischen Kerne nicht der Gesamtanzahl der für einen Knoten verwendeten Threads und die Funktion wird deaktiviert. In diesem Fall kann das Binden mit der Option „–pin“ aktiviert werden, wenn die Bindung nicht vom MPI-Startprogramm oder vom Batch-System durchgeführt wurde.

SMT/HYPERTHREADING

Die Verwendung aller logischen Kerne in einem System (d. h. SMT oder Hyperthreading) sorgt normalerweise für einen kleinen Leistungsgewinn.

GPU-BOOST

Die GPU-Kernel von GROMACS nutzen nicht die volle Leistung eines Grafikprozessors. Auch die entwickelte Wärme überschreitet nicht den Grenzwert. Es ist daher gefahrlos möglich und auch empfehlenswert, die Grafikprozessor-Taktraten über die Anwendungstaktrate bis zum unterstützten Höchstwert zu erhöhen. Seit GROMACS 5.1 erfolgt dies automatisch durch die ausführbare gmx-Datei, wenn die Berechtigungen für die Anwendungstaktrate UNBESCHRÄNKT sind. Daher wird etwa folgende Meldung ausgegeben (sinngemäß): Die Grafikprozessor-Taktraten werden durch Festlegen der Anwendungstaktraten für Tesla K80 auf (2505,875) geändert.

Wenn die Berechtigungen für die Anwendungstaktrate BESCHRÄNKT sind, gibt GROMACS folgende Warnung aus (sinngemäß):

Die Grafikprozessor-Taktraten können nicht auf den optimalen Wert gesetzt werden, da keine Berechtigungen für das Festlegen der Anwendungstaktraten für Tesla K80 vorhanden sind. Die aktuellen Werte sind (2505,562). Die maximalen Werte sind (2505,875). Verwenden Sie den Befehl „sudo nvidia-smi -acp UNRESTRICTED“ oder wenden Sie sich an den Administrator, um die Berechtigungen für die Anwendungstaktrate zu ändern.

Wie durch die Warnmeldung angezeigt, können Sie

$ sudo nvidia-smi -acp UNRESTRICTED

verwenden, um die Berechtigungen für die Anwendungstaktrate auf UNRESTRICTED festzulegen.

Wenn Ihre GROMACS-Version das GDK nicht enthält, wird folgende Warnmeldung angezeigt (sinngemäß):

GROMACS wurde ohne NVML-Unterstützung konfiguriert, daher können keine
Anwendungstaktraten für den erkannten Tesla K80-Grafikprozessor verwendet werden, um die Leistung zu steigern.
Kompilieren Sie erneut mit der NVML-Bibliothek (die mit dem verwendeten Treiber kompatibel ist) oder legen Sie die Anwendungstaktraten manuell fest.

In diesem Fall kann die maximale Boost-Taktung manuell mit folgendem Befehl konfiguriert werden. Hinweis: Die spezifische maximale Taktrateneinstellung richtet sich nach dem Grafikprozessor.

$ nvidia-smi -ac 2505,875       # maximale Taktungen für den K80-Grafikprozessor

Zusätzliche Informationen zu GPU Boost finden Sie auf der Website zur  Leistungssteigerung mit GPU Boost und K80 Autoboost.

AKTUALISIERUNG DER NACHBARSCHAFTSLISTEN

Bei Verwendung des Verlet Cut-off-Schemas (erforderlich für Grafikprozessorbeschleunigung) kann das Aktualisierungsintervall für die Nachbarschaftslisten frei gewählt werden. Wenn die Nachbarschaftslistensuche viel Zeit in Anspruch nimmt, kann das Aktualisierungsintervall für diese verlängert werden. Die Zeit für die Nachbarschaftslistensuche ist in der Datei md.log angegeben (siehe „Skript 2 – für Nachbarschaftslistensuche aufgewendete Zeit in md.log“). Die möglicherweise erforderliche Erhöhung des Grenzwertradius erfolgt automatisch. Da die Nachbarschaftslisten von der CPU berechnet werden und durch einen höheren Grenzwert mehr Force-Berechnungen erzwungen werden, wird durch die Erhöhung der Anzahl der Nachbarschaftslistenaktualisierungen (nstlist) ein Teil der Rechenlast von der CPU zum Grafikprozessor umgelagert. Außerdem erfordert die Nachbarschaftslistenberechnung die Kommunikation zwischen MPI-Ranks, was ebenfalls auf Kosten der Berechnung geht.

Computing: Num
Nodes
Num
Threads
Call
Count
Wall time
(s)
Giga-Cycles total sum %
[…]
Neighbor search 2 10 6480 32.464 1947.963 1.8
[…]
Total 1782.537 106957.655 100.0

PME-LEISTUNGSOPTIMIERUNG – PP-LASTENAUSGLEICH

[…]
Force evaluation time GPU/CPU: 4.972 ms/5.821 ms = 0.854
For optimal performance this ratio should be close to 1!
[…]

Skript 3 – PME PP-Lastenausgleich – Ausgabe in md.log

Wie oben beschrieben, kann die Last zwischen PME- und PP-Knoten ausgeglichen werden. Diese Funktion ist standardmäßig aktiviert und kann mit dem Parameter „–notunepme“ deaktiviert werden. Für grafikprozessorbeschleunigte Einzelprozess-Durchläufe wird der PP (GPU)/PME (CPU)-Lastenausgleich in der Ausgabedatei md.log (siehe „Skript 3 – PME PP-Lastenausgleich – Ausgabe in md.log“) angegeben.

SEPARATE PME-RANKS

Aufschlüsselung der PME-Gitterberechnung

Breakdown of PME mesh computation
PME redist. X/F 2 10 518322 167.004 10020.730 9.4
PME spread/gather 2 10 518322 429.501 25771.381 24.1
PME 3D-FFT 2 10 518322 123.600 7416.369 6.9
PME 3D-FFT Comm. 2 10 518322 126.829 7610.103 7.1
PME solve Elec 2 10 259161 13.470 808.259 0.8

Skript 4 – für PME-Aufgabe aufgewendete Zeit in md.log

Die Verarbeitung von Interaktionen ohne Wechselwirkung mit langer Reichweite mit PME ist eine kommunikationsintensive Aufgabe, da sie eine 3D FFT erfordert. Da die PP- und PME-Aufgaben unabhängig sind, unterstützt GROMACS den Start sog. separater PME-Knoten (Prozesse, die ausschließlich die PME-Aufgabe ausführen), um die Belastung des Netzwerks zu verringern (MPMD). Standardmäßig wird die Anzahl der PME-Ranks nur dann automatisch bestimmt, wenn keine Grafikprozessoren verwendet werden. Sie kann mit dem Parameter „–npme“ optimiert werden. Ist die von der PME-Aufgabe in der Ausgabedatei md.log vermeldete Kommunikationsdauer hoch, sind separate PME in Erwägung zu ziehen. Dies passiert normalerweise bei 3–4 (oder mehr) Knoten.

Es gibt zwei unterschiedliche Optionen für die Zuweisung von MPI-Ranks zu PP- und PME-Knoten, die für grafikprozessorbeschleunigte Durchläufe in GROMACS interessant sind:

  • Die PME-Knoten überlappen sich mit sogenannten PP-Knoten (PP-Knoten führen die Aufgabe „Force“ aus). Hierdurch wird das Netzwerk zwar stärker belastet, aber Ressourcenleerlauf wird vermieden. Die Befehlszeilenoption ist „–ddorder interleave“ (Standard für grafikprozessorbeschleunigte Durchläufe).
  • Die PME-Knoten sind eng miteinander gruppiert. Hierdurch wird das Netzwerk zwar weniger belastet, aber einige Grafikprozessoren befinden sich im Leerlauf. Die Befehlszeilenoption ist „–ddorder pp_pme“ (Standard für reine CPU-Durchläufe).

GEMEINSAME NUTZUNG EINES GRAFIKPROZESSORS DURCH MEHRERE PROZESSE
UND DEN MULTI PROCESS SERVICE (MPS)

Oftmals kann die Leistung durch die gemeinsame Nutzung eines Grafikprozessors durch mehrere MPI-Ranks erhöht werden.

Im Fall eines einzelnen Knotens mit der Nicht-MPI-Version von GROMACS kann dies einfach via Thread-MPI mit dem Parameter „-ntmpi“ und die einfache Festlegung von „-ntmpi“ (alternativ von GROMACS festlegen lassen) für die Ausführung von 2 oder mehr MPI-Ranks pro Grafikprozessor unterstützt werden.

Für Durchläufe mit mehreren Knoten und der MPI-Version von GROMACS ist das Aufteilen von Grafikprozessoren mit einer Compute Capability von 3.5 via Multi Process Service (MPS) möglich. Hierfür müssen die verwendeten Grafikprozessoren auf den exklusiven Verarbeitungsprozessmodus festgelegt werden. Zudem muss ein MPS-Steuer-Daemon für jeden Knoten gestartet werden (nvidia-cuda-mps-control):

#!/bin/bash
sudo nvidia-smi -c 3
nvidia-cuda-mps-control -decho " -started nvidia-cuda-mps-control on `hostname`"

Beispielskript für das Starten des MPS bei Einzelknoten

#!/bin/bash
echo quit | nvidia-cuda-mps-control
sudo nvidia-smi -c 0
echo " stopping MPS on `hostname`"

Beispielskript für das Anhalten des MPS bei Einzelknoten

Weitere Informationen zum MPS finden Sie hier.

ERWEITERTE OPTIONEN

Für die Domainzerlegung sind noch mehr erweiterte Einstellungen verfügbar. Bei inhomogenen Systemen (z. B. Anzahl der Atome pro Domäne) kann deren Optimierung die Leistung erhöhen. Weitere Informationen entnehmen Sie dem GROMACS-Handbuch oder der GROMACS-Benutzer-E-Mail-Liste.

Disclaimer

* GROMACS bietet viele Optionen für die Optimierung der Leistung zur Verarbeitung unterschiedlicher Eingaben und für unterschiedliche Architekturen/Systeme. Diese Anleitung soll die Aspekte abdecken, die für die grafikprozessorbeschleunigte Ausführung von GROMACS wichtig sind.

AUSFÜHRLICHE BEISPIELE

Im folgenden Abschnitt werden einige Beispiele für die Ausführung von GROMACS behandelt. Die für diese Beispiele verwendeten Eingabedatensätze sind  hier verfügbar.

Um zu beginnen, laden Sie die Archivdatei herunter und entpacken Sie sie.

$ wget ftp://ftp.gromacs.org/pub/benchmarks/water_GMX50_bare.tar.gz
$ tar -zxvf water_GMX50_bare.tar.gz

Die Daten enthalten „water“-Beispieldaten unterschiedlicher Größen mit Ordnernamen wie 0384, 0768 oder 1536. Der Name des Ordners entspricht der Anzahl der Atome in Tausenden, d. h., der Ordner 0768 enthält einen Fall mit 256.000 Wassermolekülen und 768.000 Atomen. Der erste Schritt besteht in der Vorbereitung der Daten mit dem grompp-Tool.

Um beispielsweise Fall 1536 auszuführen, verwenden Sie die folgenden Befehle. Verwenden Sie pme.mdp, wenn Sie Particle Mesh Ewald (PME) verwenden möchten. Das Ausführen des folgenden Befehls erstellt die Datei topol.tpr als Eingabe für GROMACS mdrun.

$ cd water-cut1.0_GMX50_bare/1536
$ gmx grompp -f pme.mdp

Im Folgenden werden verschiedene Varianten für das Ausführen von GROMACS mit und ohne Grafikprozessoren auf 1 oder 2 Knoten erläutert. Sie entsprechen einem Teil der Fälle, die zur Sammlung der Beispielergebnisse am Ende dieses Abschnitts ausgeführt wurden.

Die Anzahl der in den Grafikprozessorbeispielen verwendeten MPI-Ranks hängt von der Anzahl der Grafikprozessoren im System und der Anzahl von MPI-Ranks pro Grafikprozessor ab. In vielen Fällen kann durch das Ausführen von mehr als 1 MPI-Rank pro Grafikprozessor die Leistung erhöht werden. Dies wird durch die Verwendung der Thread-MPI (Einzelknotenbeispiel) und der CUDA MPS-Funktion (bei Ausführung mit mehreren Knoten) ermöglicht. Einige zusätzliche Informationen zu CUDA MPS sind in dieser Anleitung enthalten.

Bei der Verwendung von Grafikprozessoren wird die Verwendung von 2 bis 6 OMP-Threads pro Rank empfohlen. Mit „-ntomp“ oder der Variable OMP_NUM_THREADS kann die gewünschte Anzahl der OMP-Threads pro Rank angegeben werden. Experimentieren Sie ein wenig, um die ideale Anzahl von MPI-Ranks gegenüber der Anzahl von Threads pro Rank zu ermitteln und so festzustellen, welche Einstellung für die entsprechende Systemkonfiguration und die Eingabedaten am besten ist.

In den Beispielen 1, 2 und 4 unten werden 2 Tesla K80 verwendet, d. h. 4 Grafikprozessoren (2 K80-Karten) pro Knoten.

5 Beispiele werden auf Knoten mit 2 Haswell CPU-Sockeln ausgeführt.

  • Gesamtanzahl: 32 Kerne
  • Hyperthreading deaktiviert

Beispiel 1: Die Startparameter (ntmpi und ntomp) sind nicht angegeben. GROMACS entscheidet daher automatisch, wie viele MPI-Ranks pro Grafikprozessor und wie viele OMP-Threads pro Rank gestartet werden sollen.

Führen Sie den Durchlauf auf einem einzelnen Knoten mit 4 Grafikprozessoren und Thread-MPI durch und lassen Sie GROMACS die Startparameter (ntmpi, ntomp) selbst bestimmen.

$ GROMACS_BIN_DIR/gmx mdrun -resethway -noconfout -nsteps 4000 -v -pin on -nb gpu

Wenn Sie Zeit dafür haben, können Sie noch andere Kombinationen von MPI-Ranks pro Grafikprozessor und OMP-Threads pro Rank testen, um zu sehen, was am besten funktioniert. Die verfügbaren Optionen richten sich nach der Gesamtanzahl der CPU-Kerne und der Anzahl der Grafikprozessoren pro Knoten. Bei 4 Grafikprozessoren/Knoten mit 32 CPU-Kernen pro Knoten können Sie beispielsweise die folgenden Kombinationen testen, um die bestmögliche Leistung zu ermitteln.

-ntmpi 4 -ntomp 8 # 1 rank per GPU with 8 threads per rank
-ntmpi 8 -ntomp 4 # 2 MPI ranks per GPU with 4 threads per rank
-ntmpi 16 -ntomp 2 # 4 MPI ranks er GPU with 2 threads per rank

Für die Beispiele 2–5 unten lieferten die ausgewählten Fälle das beste Ergebnis auf dem Benchmark-Testsystem.

Beispiel 2: Ausführung auf Einzelknoten mit 4 Grafikprozessoren, 4 OMP-Threads/Rank, 8 Ranks, 2 MPI-Ranks pro Grafikprozessor mit Thread-MPI

$ GROMACS_BIN_DIR/gmx mdrun -ntmpi 8 -ntomp 4 -resethway -noconfout -nsteps 4000 -v -pin on -nb gpu

Beispiel 3: Ausführung auf Einzelknoten nur mit CPU-Kernen, 1 OMP-Thread/Rank, 32 Ranks, mit Thread-MPI

$ $GROMACS_BIN_DIR/gmx mdrun -ntmpi 32 -ntomp 1 -resethway -noconfout -nsteps 4000 -v -pin on -nb cpu

Beispiel 4: Ausführung auf 2 Knoten mit 4 Grafikprozessoren/Knoten, 2 OMP-Threads/Rank, 16 Ranks pro Knoten, 4 MPI-Ranks pro Grafikprozessor mit CUDA MPS für mehrere MPI-Ranks pro Grafikprozessor:

$ OMP_NUM_THREADS=2 mpirun -np 32 $GROMACS_BIN_DIR/gmx_mpi mdrun -resethway -noconfout -nb gpu -nsteps 8000 -v -pin on

Beispiel 5: Ausführung auf 2 Knoten nur mit CPU-Kernen, 1 OMP-Thread/Rank, 32 Ranks pro Knoten

$ OMP_NUM_THREADS=1 mpirun -np 64 $GROMACS_BIN_DIR/gmx_mpi mdrun -resethway -noconfout -nb cpu -nsteps 8000 -v -pin on

Benchmarks

In diesem Abschnitt wird die Leistung mit mehreren Grafikprozessoren auf einem einzelnen Knoten beschrieben. Zudem finden Sie hier die Benchmarks für die Leistung auf einem, zwei und vier Knoten mit zwei Tesla P100-Grafikkarten pro Knoten. Jede P100-Karte verfügt über genau einen Grafikprozessor mit Pascal-Architektur. Für die Durchläufe wurden Variationen der oben beschriebenen Befehlszeilen für die „water“-Daten der Größen 0768, 1536 und 3072 verwendet.

768.000 – Leistung mit „water“-Daten auf Einzelknoten
1,5 Mio. – Leistung mit „water“-Daten auf Einzelknoten
3 Mio. – Leistung mit „water“-Daten auf Einzelknoten
3 Mio. – skalierbare Leistung mit „water“-Daten

Empfohlene Systemkonfigurationen

Hardwarekonfiguration

PC

Parameter
Specs

CPU Architecture

x86

System Memory

16-32GB

CPUs

8 Cores, 8 GHz
10 Cores, 2.2 GHz
16 Cores, 2GHz

GPU Model

NVIDIA TITAN X

GPUs

1-2 TITAN X

Servers

Parameter
Specs

CPU Architecture

x86

System Memory

32GB

CPUs/Nodes

2 (16+ cores, 2+ GHz)

GPU Model

NVIDIA® Tesla® P100

GPU/Node

1-2 Tesla GPU cards

Interconnect

InfiniBand

Softwarekonfiguration

Software stack

Parameter
Version

OS

Linux

GPU Driver

352.79 or newer

CUDA Toolkit

7.5 or newer

Compiler

GCC 5.0

Ihre ideale Grafikprozessorlösung