MPI Parallel Programming unter Linux

Parallele Programmierung unter Linux: MPI mit MPICH2

Grüße, dieses Mal werden wir über parallele Programmierung sprechen. Dies ist eine Form der Berechnung, bei der viele Befehle gleichzeitig ausgeführt werden, und zwar nach dem Prinzip größerer Probleme, die in kleinere unterteilt werden können, die dann gleichzeitig (parallel) gelöst werden.

Für diese Funktionalität wurden mehrere Bibliotheken entwickelt, heute ist es MPI (Message Passing Interface), das als “Message Passing Interface” übersetzt wird. MPI ist eine Spezifikation für die Programmierung der Kommunikation zwischen Prozessen. Hierbei handelt es sich um Bibliotheken mit Funktionen für C, C ++ oder Fortran, die in den Programmen zur Kommunikation von Daten zwischen verschiedenen Prozessen verwendet werden.

Eigenschaften:

  • Standardisierung
  • Portabilität: Multicomputer, Multiprozessoren, Netzwerke, heterogen (Prozessoren mit unterschiedlichen Eigenschaften).
  • Gute Leistungen (Code sehr gut gemacht).

Ein Vorteil der Verwendung von MPI besteht darin, dass es eine hohe Akzeptanz hat, da es portabel ist (und auf verschiedene parallele Computer migriert werden kann) und vom MPI Forum unterstützt wird, das aus rund 40 Organisationen besteht, die Modelle für die Entwicklung paralleler Programme erstellen . Die aktuelle Version von MPI ist 2 (die in diesem Kurs verwendet wird).

MPI installieren

Die Installation ist denkbar einfach. Einfach in unser Terminal stellen:

 sudo apt-get installiere libcr-dev mpich2 mpich2-doc 

Es zeigt uns den folgenden Inhalt:

1.png

Hinweis
Wenn Sie MPI verwenden möchten, sollten Sie keine anderen parallelen Programmierbibliotheken verwenden, da die Kompatibilität zwischen diesen Bibliotheken viele Kopfschmerzen verursachen kann.

Unser erstes Programm:

 #include <mpi.h> #include <stdio.h> int main (int argc, char * argv []) { int id, total_proc; MPI_Init (& argc, & argv); MPI_Comm_rank (MPI_COMM_WORLD, & id); MPI_Comm_size (MPI_COMM_WORLD, & total_proc); printf ("Hallo TechnoWikis aus dem Prozess% d von insgesamt% d  n", id, total_proc); MPI_Finalize (); return 0; } 

Wir erarbeiten:

 mpicc hallo.c -o hallo 

Wir führen aus:

See also  Richten Sie das MVC-Conceto ein

1.png

Wie Sie sehen, ist die Syntax sehr ähnlich, als würde man mit gcc normalerweise pro Terminal arbeiten. Verwenden Sie -np “Anzahl Prozessoren” , um zu bestimmen, mit wie vielen Prozessoren wir arbeiten werden. Es wird empfohlen, dass die Anzahl der Prozessoren, die wir dort platzieren, gleich ist diejenigen, die physisch im Computer sind.

In MPI definierte Funktionen

Das Schöne an der Verwendung von MPI ist, dass Sie mit nur 6 implementierten Funktionen bereits ein Programm parallel haben, obwohl es für fortgeschrittene Aspekte viel mehr Funktionen gibt. Alle von ihnen beginnen mit MPI_ und erzwingen, dass Programme die # include-Direktive “mpi.h” haben.

Alle Programme in MPI müssen initialisiert und finalisiert werden, da in diesem Sektor (Umgebung) die Kommunikation und Bearbeitung von Nachrichtenübergaben (MPI_Init, MPI_Finalize) erfolgt.

Die laufenden Prozesse können jederzeit wissen, wie viele MPI-Prozesse zu einer Gruppe von Prozessen gehören, mit der Terminologie MPI_Comm_size und welcher Auftragsnummer sie belegt sind (beginnt mit 0, wie fast alles in der Datenverarbeitung).

Kommunikationsmechanismen

Die Punkt-zu-Punkt-Nachrichten müssen vom Absender explizit gesendet und vom Empfänger explizit empfangen werden (in einem anderen Lernprogramm werden andere kollektive Kommunikationsvorgänge erläutert), für die wir zwei Grundfunktionen verwenden (MPI_Send und MPI_Recv).

Da ich die Nachrichten häufig benannt habe, erklären wir sie förmlich. Bei den Nachrichten handelt es sich um die Informationen, die von einem Absender an einen Empfänger gesendet werden. In diesem Fall von einem Prozessor A zu einem Prozessor B (obwohl es gleichzeitig viel mehr sein kann). Eine Nachricht in MPI besteht aus einer bestimmten Anzahl von Elementen desselben MPI-Typs.

Die Grundtypen in MPI sind:

  • MPI_CHAR
  • MPI_SHORT
  • MPI_INT
  • MPI_LONG
  • MPI_UNSIGNED_CHAR
  • MPI_UNSIGNED
  • MPI_FLOAT
  • MPI_DOUBLE
  • MPI_LONG
  • MPI_BYTE
  • MPI_PACKED
See also  Wie kann man wissen, von welchem ​​Gerät sie mein Instagram betreten haben?

Wenn Sie keine brauchen, machen Sie sich keine Sorgen, Sie können Ihre eigenen Typen bauen, zum Beispiel die berühmten Bauwerke.

Wie sende ich eine Nachricht von einem Prozess zu einem anderen? Easy MPI macht es:

 #include <mpi.h> #include <stdio.h> / ** @param id Prozesskennung @param total_proc Gesamtprozesse * / int main (int argc, char * argv []) { int id, total_proc, i, tag = 99; MPI_Status Status; MPI_Init (& argc, & argv); // Die Parallelisierungsumgebung ist initialisiert, schwieriges Wort xD MPI_Comm_rank (MPI_COMM_WORLD, & id); / * Wir bekommen die ID * / MPI_Comm_size (MPI_COMM_WORLD, & total_proc); / * Gesamtzahl der Prozesse * / printf ("Hallo TechnoWikis aus dem Prozess% d von insgesamt% d  n", id, total_proc); if (id == 0) {// Der Prozess, der die Nachricht sendet, wird identifiziert i = 23; // zu sendende Nachricht / * MPI_Send (Daten, Änderungszähler, Typ, Absender, Priorität, parallele Umgebung); * / MPI_Send (& i, 1, MPI_INT, 1, Tag, MPI_COMM_WORLD); } if (id == 1) { / * MPI_Recv (Daten, Änderungszähler, Typ, der sie an mich gesendet hat, Priorität, parallele Umgebung, Status der Nachricht); * / MPI_Recv (& i, 1, MPI_INT, 0, Tag, MPI_COMM_WORLD & Status); printf ("Prozess% d hat% d  n erhalten", id, i); } MPI_Finalize (); // Die Umgebung ist fertig return 0; } 

Dieselben Befehle werden zum Kompilieren und Ausführen verwendet.

1.png

Wie im Beispiel zu sehen ist, ist es ganz einfach, es zu beweisen, es wäre in diesem Fall ausreichend zu definieren, wer sendet und wer empfängt. Es werden jeweils zwei Funktionen verwendet. Naja Leute, das war alles für heute, irgendwelche Fragen oder Bedenken und teilen. Grüße

administrator

Leave a Reply

Your email address will not be published. Required fields are marked *