CudaMPI: Nachrichtenaustausch zwischen Rechnerknoten über Cuda und MPI

Student:Matthias Huth
Title:CudaMPI: Nachrichtenaustausch zwischen Rechnerknoten über Cuda und MPI
Type:bachelor thesis
Advisors:Veldema, R.; Philippsen, M.
State:submitted on November 10, 2014
Prerequisits:
Topic:

Voraussetzungen
MPI ("Message Passing Interface") ist eine Bibliothek zum Nachrichtenaustausch zwischen Rechnern und wird häufig auf Rechnerbündel verwendet. Zur Kommunikation stellt MPI unter anderem den Befehl MPISend(...) zur Verfügung, mit dem ein gefüllter Puffer an einen anderen Rechner gesendet werden kann. Analog dazu existiert der Befehl MPIRecv(...) zum Empfang.
Cuda und OpenCL sind Schnittstellen zum einfachen Programmieren von Berechnungen auf Grafikkarten oder anderen allgemeineren Beschleunigern. Hierzu wird ein Kernel erstellt, der dann von mehreren Tausend Threads auf dem Beschleuniger parallel ausgeführt wird.
Wir haben Zugriff auf ein aus 8 Maschinen bestehendes Rechnerbündel, die jeweils mit zwei Grafikkarten ausgestattet sind und jeweils über Cuda oder OpenCL ansprechbar sind.

Ziel
Bisher gibt es noch keinen einfachen Weg über den Cuda und MPI gleichzeitig verwendet werden können, da MPI nur zwischen normalen CPU-Threads und nicht zwischen GPU-Threads funktioniert. Deshalb soll in dieser Arbeit ein CudaMPI-Framework geschaffen werden. Hierzu müssen auf der GPU Sende- und Empfangsanfragen gesammelt werden, um sie danach auf der CPU zu bearbeiten. Es werden in diesem Fall zwei MPI-Schnittstellen erforderlich sein: die System-MPI Schnittstelle für die Kommunikation zwischen Maschinen und die neue CudaMPI Schnittstelle, die die System-MPI Schnittstelle kapselt und sich um die Kommunikation mit der GPU kümmert.
Beispiele: Ein GPU-Thread auf der GPU 1 von Maschine 1 möchte an die GPU 3 von Maschine 2 über MPISend eine Nachricht senden. Die CPU von Maschine 1 muss dazu diese Sendeanfrage der GPU erkennen, ein MPISend über die System-MPI Schnittstelle ausführen und dem GPU-Thread auf Maschine 1 ein Signal senden, um mitzuteilen, dass die Sendeanfrage bearbeitet ist.
Die CPU von Maschine 2 soll erkennen, dass die GPU 3 auf derselben Maschine MPIRecv aufgerufen hat und dementsprechend über die System-MPI-Schnittstelle ein MPIRecv ausführen. Sobald die Daten empfangen sind, kann dann die CPU auf Maschine 2 dem GPU-Thread signalisieren, dass die Übertragung erfolgt ist und der GPU-Thread weiter laufen kann.

Aufgaben
Damit das Framework funktioniert, muss die normale MPI-Bibliothek so erweitert werden, dass GPU-Threads unterstützt werden. Dafür muss unter anderem jeder Thread einen eigenen Identifier bekommen.
In dieser Arbeit soll eine CudaMPI-Bibliothek realisiert werden, die es ermöglicht, dass GPU-Threads und CPU-Threads, die auf verschiedenen Rechnern verteilt sind, untereinander kommunizieren. Die Kommunikation zwischen den Maschinen soll dabei über eine schon vorhandene System-MPI-Implementierung erfolgen. Um Namenskonflikten mit der System-MPI Schnittstelle aus dem Weg zu gehen, sollen alle CudaMPI-Funktionen statt MPI den Prefix CMPI bekommen (z.B. CMPISend anstatt MPISend). Die Wahl zwischen Cuda und OpenCL ist frei gestellt.
Zu implementieren sind unter anderem (C)MPIinit, (C)MPIFinalize, (C)MPICommRank, (C)MPICommSize (C)MPISSend, (C)MPIISend, (C)MPIBSend, (C)MPIRSend, (C)MPIRecv, (C)MPIIRecv.
Die Semantik dieser Befehle ist zu finden auf http://www.mcs.anl.gov/research/projects/mpi/standard.html
Die Kommunikation zwischen den Rechnern soll dabei optimiert werden. Wenn zum Beispiel N GPU-Threads auf der gleichen GPU Nachrichten zu einem anderen Rechner schicken schicken, sollen die Nachrichten in einem Send-Puffer kombiniert werden.
Als Masterarbeit sollen zusätzlich kollektive Operationen (MPIBarrier, MPIReduce, MPIBcast, MPIAll2All, usw) implementiert werden.
Dabei ist zu beachten, dass manche GPU-Threads (die an der Barriere teilnehmen sollen) noch gar nicht ausgeführt werden. Der Code der GPU-Threads muss in diesem Fall angepasst werden.

Literatur

Meilensteine

  • Einarbeiten in MPI + Cuda
  • Implementierung von MPIISend + MPIIRecv zwischen 2 Maschinen
  • Implementierung von MPIRSend
  • Implementierung von MPIBSend
  • Implementierung von MPISSend
  • (Nur im Fall einer Masterarbeit: Implementierung von kollektiven Operationen)
  • Optimierungen der Kommunikation
  • Evaluation der Implementierung
  • Ausarbeitung
watermark seal