Matrix Transposition mit gaspi_read_notify Vanessa End HPCN Workshop 11. Mai 2016
Überblick Motivation Matrix Transposition GASPI Matrix Transposition in GASPI Zusammenfassung und Ausblick 2
Motivation Bottleneck vieler HPC Anwendungen ist die Kommunikation Keine Aussicht auf Besserung bei Exascale Neue Kommunikations- und Programmiermodelle RDMA einseitige Kommunikation PGAS UPC OpenSHMEM GASPI Hybride Programmierung: MPI oder GASPI + OpenMP pthreads 3
Motivation Einseitige, asynchrone Kommunikationsroutinen erfordern ein Umdenken in HPCtypischen Kommunikationsschemata, wie zum Beispiel Halo Exchange Alltoall Matrix Transposition Stencil Kleine Sammlung von Benchmarks auf GitHub: https://github.com/pgas-community-benchmarks 4
Motivation Einseitige, asynchrone Kommunikationsroutinen erfordern ein Umdenken in HPCtypischen Kommunikationsschemata, wie zum Beispiel Halo Exchange Alltoall Matrix Transposition Stencil Kleine Sammlung von Benchmarks und Kommunikationskerneln auf GitHub: https://github.com/pgas-community-benchmarks 5
Matrix Transposition Matrix Transposition ist eine Erweiterung einer allgemeinen Alltoall Funktion 6
Matrix Transposition Matrix Transposition ist eine Erweiterung einer allgemeinen Alltoall Funktion Nach der Kommunikation folgt die lokale Transposition Multithreaded, im Idealfall 7
Matrix Transposition in MPI https://github.com/pgas-community-benchmarks/pipelined-transpose 8
Matrix Transposition in MPI - Probleme - Keine Überlappung von Kommunikation und lokaler Transposition Barrier für die Threads notwendig Lösung: Überlappung durch einseitige Kommunikation (GASPI) 9
GASPI BMBF Projekt bis 06/2015 PGAS Standard www.gaspi.de Skalierbarkeit Asynchrones, einseitiges Kommunikationsmodell Fehlertoleranz Timeouts und variable Knotennutzung Status einzelner Knoten mit dem Statevector überwachbar Flexibilität Interoperabel mit MPI Kein festgelegtes Speichermodell Segmente 10
GASPI Segmente 11
GASPI Einseitige Kommunikation U.a. gaspi_read und gaspi_write Queues Einfache Benachrichtigung des passiven Prozesses U.a. gaspi_notify und gaspi_notify_waitsome Passive Kommunikation Gruppen und kollektive Operationen Global Atomics GPI2 implementiert GASPI www.gpi-site.com 12
Einseitige Kommunikation und Queues gaspi_write und gaspi_read erstellen Kommunikationsaufträge in verschiedenen Queues, die dann vom Netzwerk abgearbeitet werden. gaspi_wait pollt auf eine bestimmte Queue, bis alle einseitigen Kommunikationsaufträge in dieser Queue abgearbeitet sind. 13
GASPI Notifications Notifications zur Benachrichtigung des passiven Prozesses durch gaspi_write und gaspi_notify oder gaspi_write_notify Überprüfung der Notifications mit gaspi_notify_waitsome 14
GASPI Notifications Notifications zur Benachrichtigung des passiven Prozesses durch gaspi_write und gaspi_notify oder gaspi_write_notify Überprüfung der Notifications mit gaspi_notify_waitsome Notification erst dann sichtbar, wenn zuvorgehende writes an gleiches Segment, gleichen Knoten und gleiche Queue geschrieben wurden 15
Matrix Transpose mit gaspi_write_notify https://github.com/pgas-community-benchmarks/pipelined-transpose #pragma omp parallel{ if(tid == 0){ for (rank!= my_rank) gaspi_write_notify(submatrix[rank]) while (!complete){ gaspi_notify_waitsome(&my_submatrix) transpose(&my_submatrix) Kein Barrier mehr Alle Kommunikationsanfragen werden vom Netzwerk behandelt, während gleichzeitig lokal transponiert wird Gezielte Abfrage geschriebener Daten möglich 16
Matrix Transpose mit gaspi_write_notify https://github.com/pgas-community-benchmarks/pipelined-transpose #pragma omp parallel{ if(tid == 0){ for (rank!= my_rank) gaspi_write_notify(submatrix[rank]) while (!complete){ gaspi_notify_waitsome(&my_submatrix) transpose(&my_submatrix) Alle Nachrichten werden gleichzeitig an das Netzwerk abgegeben Statische Aufteilung der Untermatrizen auf die Threads Kein Barrier mehr Alle Kommunikationsanfragen werden vom Netzwerk behandelt, während gleichzeitig lokal transponiert wird Gezielte Abfrage geschriebener Daten möglich 17
Motivation für Matrix Transposition mit reads Nicht alle Daten müssten sofort kommuniziert werden Entlastung des Netzwerks Bessere Überlappung von Kommunikation und lokaler Transposition, bessere Auslastung der Threads möglich ABER: gaspi_read und gaspi_notify funktionieren nicht so, wie gaspi_write und gaspi_notify Lösung: Implementierung von gaspi_read_notify http://www.gaspi.de/readings/read_notify_gaspi.pdf 18
gaspi_read_notify als GASPI Applikation https://github.com/pgas-community-benchmarks/pipelined-transpose Emulation eines read_notify als GASPI Applikation innerhalb des Pipelined Transpose Pro Queue 1 read Warten bis zuvor gestarteter read fertig ist Notify auf eigenes Segment Nächsten read starten 19
Pipelined Transpose mit read_notify Emulation https://github.com/pgas-community-benchmarks/pipelined-transpose #pragma omp parallel{ if(tid == 0){ for (rank!= my_rank){ read_notify_em(submatrix[rank]) while (!complete){ gaspi_notify_waitsome(&my_submatrix) transpose(&my_submatrix) Es werden nur dann neue reads abgesetzt, wenn auch Kapazitäten frei sind (wait auf Queue) Weiterhin Überlappung von Kommunikation und Transposition 20
Community Benchmark Ergebnisse https://github.com/pgas-community-benchmarks/pipelined-transpose/wiki InfiniBand 7D Enhanced Hypercube 12 Cores/Prozess native Implementierung von gaspi_read_notify 21
gaspi_read_notify Implementierung Innerhalb der GPI2-1.1.1 Direkt auf ibverbs 2 aufeinanderfolgende, geordnete reads read2 read1 22
Pipelined Transpose mit read_notify Variante 1 Statische Verteilung der reads und der bearbeiteten Blöcke #pragma omp parallel for(i < num_initial_reads){ gaspi_read_notify(&i) while(!complete) if(!my_submatrix.transpose) if(gaspi_notify_waitsome(&my_submatrix, GASPI_TEST) == GASPI_SUCCESS){ transpose(&my_submatrix) if(my_reads!= complete){ gaspi_read_notify(&next_read) 23
Pipelined Transpose mit read_notify Variante 2 Dynamische Verteilung der reads und der bearbeiteten Blöcke #pragma omp parallel for(i < num_initial_reads){ gaspi_read_notify(&i) while(!complete) if(gaspi_notify_waitsome(&any_submatrix, GASPI_TEST) == GASPI_SUCCESS){ transpose(&any_submatrix) if(reads!= complete){ gaspi_read_notify(&next_read) 24
Eigene Ergebnisse Cluster 1 InfiniBand QDR Fat Tree 6 Cores/Prozess Intel(R) Xeon(R) X5670 @ 2.93GHz 25
Eigene Ergebnisse Cluster 2 InfiniBand FDR10 Fat Tree 8 Cores/Prozess 2x Intel(R) Xeon(R) E5-2670 @ 2.6 GHz 26
Zusammenfassung Neue Programmierparadigmen ermöglichen und erfordern ein Neugestalten der Kommunikation Relevante Kommunikationsschemata können als Kernel implementiert werden PGAS Community Benchmarks gaspi_write_notify ist ein mächtiges Werkzeug für die Umgestaltung der Kernel Ein notified read scheint vielversprechend Implementierung noch ausbaufähig 27
Ausblick Implementierungsalternativen für gaspi_read_notify Wechsel des Anwendungsfalls Graph Traversal Forschungsergebnisse gegebenenfalls nutzbar für teilevaluierbaren, asynchronen Alltoall(v) 28
Fragen, Anregungen und Diskussionen sind herzlich willkommen! THE END 29