Beim Schreiben von MPI 3.0 - Code, soll ich weitergeben argc
und argv
auf den MPI_Init
Anruf oder nicht, und warum?
EDIT: Da die Antwort von Bill Barth einige Fragen aufwirft, möchte ich einige Anmerkungen machen:
- Bestehen
argc
/argv
ist seit MPI 1.1 nicht erforderlich. - Die Frage ist speziell, warum sollte / sollte man nicht bestehen
argc
/argv
( warum sollte man dann nicht wirklich eine Antwort sein). - Manchmal können Sie jedoch nicht übergeben
argc
/argv
anMPI_Init
(Schreiben einer Bibliothek, die statische Initialisierung verwendet, um MPI zu starten, wenn main außerhalb Ihrer Kontrolle liegt und MPI ein Implementierungsdetail ist).
EDIT2: Die Frage, warum Sie nicht verwenden würden,MPI_Init(argc, argv)
ist jetzt zu oft gekommen. Einige Gründe:
Aus Gründen der Kompatibilität mit älteren / nicht kompatiblen / kompatiblen MPI <1.1-Implementierungen ist dies nicht möglich, da diese bei Verwendung von MPI2- oder MPI3-Funktionen sowieso nicht funktionieren.
MPI_Init()
Initialisiert die MPI-Laufzeit auf die gleiche Weise wieMPI_Init(argc, argv)
MPI_Init(argc, argv)
entfernt Argumente an die MPI - Laufzeit übergebenargc
, undargv
und initialisiert MPI. AFAIK ist es der einzige Weg , zu reinigenargc
undargv
so , wenn Sie diese brauchen brauchen Sie keine MPI Argumente zu haben , es zu benutzen.MPI_Init()
kann in mehr Situationen verwendet werden, alsMPI_Init(argc, argv)
. Zum Beispiel kann Ihre Bibliothek, die MPI als Implementierungsdetail verwendet, testen, ob MPI initialisiert ist. Wenn nicht, wird aufgerufenMPI_Init()
und das Richtige passiert. Ihre Benutzer nicht wissen , dass Sie mpi verwenden, muss nicht passierenargc
,argv
Ihre Bibliothek, brauchte nicht ihr Haupt ändern (falls es nehme keine Argumente) Ihre Bibliothek zu nutzen ....
MPI_Init()
die muss richtig die Argumente erhalten Sie weitergebenmpirun
/mpiexec
irgendwie (es ist nicht spezifiziert , wie), und daMPI_Init()
kann in mehr Situationen verwendet werden , alsMPI_Init(argc, argv)
(und ohne Abhilfen), I don‘ Ich verstehe den Sinn der Verwendung nicht wirklich,MPI_Init(argc, argv)
wenn Sie auf MPI 3.0 abzielen.argc
undargv
von MPI Argumenten und initialisieren MPI dann verwendenMPI_Init(argc, argv)
, sonstMPI_Init()
ist in Ordnung (und manchmal ist es notwendig).Antworten:
Ich würde sie definitiv übergeben, aber ich würde die Zeiger wie diese MPI_init (& argc, & argv) übergeben, was einen perfekt gültigen Aufruf von MPI_init (NULL, NULL) in Ihrer Funktion ermöglicht.
quelle
Ich weiß nicht, ob der 3.0-Standard etwas Neues enthält, das es in C / C ++ optional macht, sie nicht zu bestehen, aber ich würde sie definitiv bestehen. Ich kenne den aktuellen Status nicht, aber in der Vergangenheit haben viele Implementierungen bei der Ausführung zusätzliche Befehlszeilenargumente an Ihr Programm übergeben und diese dann herausgeschnitten
MPI_Init()
. Wenn Sie Befehlszeilenargumente verwenden möchten, um Optionen an Ihr Programm zu übergeben, und wenn Sie die Implementierung nicht bearbeiten lassen, müssen Sie sowohl Ihre Argumente als auch eine möglicherweise unbekannte Anzahl und Art von Argumenten aus der jeweiligen Implementierung interpretieren du benutzt. Es ist auch sehr wahrscheinlich, dass diese Argumente von Implementierung zu Implementierung variieren.Es ist ziemlich normal,
MPI_Init()
mitargc
und anzurufen.argv
Warum sollten Sie das nicht tun?quelle
mpirun
/mpiexec
mit einigen Parameternmpirun
aufrufe , kann ich einige Umgebungsvariablen festlegen, bevor ich mein Programm starte, und diese dann von innen lesenMPI_Init
. (2) Ich habe nicht jede mögliche Implementierung getestet, aber wie die Frage besagt, bin ich nur an MPI 3.0-kompatiblen Implementierungen interessiert. Es gibt nicht viele von denen, die arkan sind .