2016-03-22 9 views
0

Ich implementiere derzeit eine Message-Assing-basierte Implementierung, um rechenintensive Arbeit an einen anderen Knoten mit einer GPU auszulagern. So bekam ich ein Master/Slave-Modell, bei dem der Host Daten generiert und möchte, dass er mit dem Slave (+ angeschlossene GPU) berechnet wird. Ich habe dies bisher mit OpenMPI implementiert, wo ich mein Programm auf diesen 2 Knoten starte und die Daten per Message Passing sende. Was ich jetzt tun möchte, ist die Implementierung des Slaves zu ändern, so dass es dauerhaft läuft und auf Daten wartet, bis ein Host sich mit ihm verbindet. Und dieser Host könnte ein Windows- oder Linux-Host sein. Also ich möchte Master & Slave mit mpirun nicht starten, sondern nur den Host normal und will es zur Laufzeit an meinen Slave anschließen. Eine weitere Voraussetzung ist, dass ich Template-Klassen verwende, deren Größe ich zur Kompilierzeit nicht kenne. Ich fing an, ein einfaches TCP-Protokoll zu erstellen, das nur eine Struktur mit einem Nachrichten-Tag (unsigned short) und den Payload/Daten (als eine Union) darin war. Hier war das Problem, dass ich die Templates in der Union nicht verwenden konnte (was sinnvoll ist).C++ Message Passing Library wie MPI

Also, um mein Problem zu lösen, suche ich nach einer Message-passing High-Level-Bibliothek mit MPI-wie Syntax optimal. Gibt es eine Möglichkeit, dies zu tun? Verwenden Sie MPI, aber nicht mpirun und verbinden Sie sich stattdessen zur Laufzeit mit anderen Prozessen.

+0

zeromq kommt in den Sinn –

+0

0mq vielleicht? https://en.wikipedia.org/wiki/ZeroMQ –

+0

@David, Severin: zeromqs Schöpfer hat seinen Ersatz freigegeben, nanomsg –

Antwort

1

MPI bietet eine Möglichkeit zum Verbinden von Server/Client-Prozessen. Dies wird in Abschnitt 10.4 von the standard diskutiert, ein Anwendungsfall ist:

Ein Server möchte Verbindungen von mehreren Clients akzeptieren. Clients und Server können parallele Programme sein.

Grundsätzlich beinhaltet dies, MPI_Open_port/MPI_Comm_accept auf dem Server, und MPI_Comm_connect auf der Client-Seite. Es gibt einige (Name Publishing) zum Herstellen von Verbindungen.

Es scheint jedoch, ein selten verwendetes Feature zu sein, und ich bin mir nicht sicher, wie gut die verschiedenen Implementierungen das handhaben. Selbst der Standard warnt, dies soll keine besonders robuste Lösung sein.

Während Boost.MPI dies nicht direkt zu unterstützen scheint, sollte es möglich sein, Boost.MPI für die eigentliche Kommunikation zu verwenden, wenn Sie die Verbindung mit der C-Schnittstelle herstellen.

+1

Open MPI implementiert es. Das Problem ist, dass 'MPI_Comm_accept' ein blockierender Aufruf ist und es kein Äquivalent zu' select (2) 'gibt. Das bedeutet, dass der Server Clients entweder einzeln verarbeiten oder mit Threads versehen werden muss. Und Multithreading mit MPI, besonders bei 'MPI_THREAD_MULTIPLE', ist eine weitere Dose Würmer. –