Soll ich MPI_Init Befehlszeilenargumente übergeben oder nicht?


8

Beim Schreiben von MPI 3.0 - Code, soll ich weitergeben argcund argvauf den MPI_InitAnruf oder nicht, und warum?

EDIT: Da die Antwort von Bill Barth einige Fragen aufwirft, möchte ich einige Anmerkungen machen:

  • Bestehen argc/ argvist 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/ argvan MPI_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 wie MPI_Init(argc, argv)

  • MPI_Init(argc, argv)entfernt Argumente an die MPI - Laufzeit übergeben argc, und argv und initialisiert MPI. AFAIK ist es der einzige Weg , zu reinigen argcund argvso , wenn Sie diese brauchen brauchen Sie keine MPI Argumente zu haben , es zu benutzen.

  • MPI_Init()kann in mehr Situationen verwendet werden, als MPI_Init(argc, argv). Zum Beispiel kann Ihre Bibliothek, die MPI als Implementierungsdetail verwendet, testen, ob MPI initialisiert ist. Wenn nicht, wird aufgerufen MPI_Init()und das Richtige passiert. Ihre Benutzer nicht wissen , dass Sie mpi verwenden, muss nicht passieren argc, argvIhre Bibliothek, brauchte nicht ihr Haupt ändern (falls es nehme keine Argumente) Ihre Bibliothek zu nutzen ....


Ich folge nicht, warum die Antwort von BillBarth Ihre Frage nicht beantwortet. Der Teil "Warum sollten Sie nicht?" Fasst den Kern seiner Antwort zusammen, in der beschrieben wird, was mit früheren MPI-Implementierungen passiert ist und warum das Nichtübergeben von Argumenten Probleme verursachen kann. Vielleicht suchen Sie etwas Bestimmtes?
Geoff Oxberry

@GeoffOxberry Das Problem mit dem Warum würden Sie nicht antworten ist, dass es so gut ist wie ein Warum würden Sie antworten. Da alle MPI - Implementierungen MPI unterstützt> müssen 1.1 die Alternative bieten , MPI_Init()die muss richtig die Argumente erhalten Sie weitergeben mpirun/ mpiexec irgendwie (es ist nicht spezifiziert , wie), und da MPI_Init()kann in mehr Situationen verwendet werden , als MPI_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.
Gnzlbg

Die Kompatibilität mit MPI-Implementierungen, die MPI <1.1 unterstützen, ist sowieso nicht möglich, wenn Sie MPI 2.0- oder MPI 3.0-Funktionen verwenden müssen.
Gnzlbg

2
Du vermisst immer noch meinen grundlegenden Punkt. Die MPI-Distribution kann zur Ausführungszeit nicht erkennen, ob Ihr MPI_Init NULL-Werte übergibt oder nicht, sodass wahrscheinlich Daten in die Befehlszeile eingefügt werden. Wenn Sie argc und argv nicht übergeben, kann MPI_Init sie nicht bearbeiten, um ihre Ergänzungen zu entfernen. Daher muss Ihr Code gegenüber falschen Befehlszeilenargumenten aus MPI robust sein. Warum sollten Sie daher das Risiko eingehen, sich mit einem beliebigen und möglicherweise widersprüchlichen Satz von Argumenten befassen zu müssen, wenn Sie diese an MPI_Init übergeben und einen sauberen Satz zurückerhalten können? Wenn du nicht kannst, kannst du nicht, aber du solltest .
Bill Barth

Siehe die zweite Bearbeitung der Frage. Grundsätzlich , wenn Sie reinigen wollen argcund argvvon MPI Argumenten und initialisieren MPI dann verwenden MPI_Init(argc, argv), sonst MPI_Init()ist in Ordnung (und manchmal ist es notwendig).
Gnzlbg

Antworten:


2

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.


1

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()mit argcund anzurufen. argvWarum sollten Sie das nicht tun?


Die Spezifikation besagt, dass nach MPI 1.1, wenn Sie MPI_Init null übergeben, die Argumente aus der Umgebung gelesen werden sollen. Warum sollten Sie sie also überhaupt an Ihre Anwendung weitergeben, wenn sie aus der Umgebung gelesen werden kann? Wenn Laufzeiten die Argumente trotzdem an die Anwendung übergeben, ist es sinnvoll, MPI_Init mit ihnen aufzurufen, sodass sie zumindest in Ihrer Laufzeit bereinigt werden, bevor der Rest Ihrer Anwendung sie verwendet.
Gnzlbg

OK, so haben Sie jeden Stapel zur Verfügung getestet, um herauszufinden , ob sie gefangen haben mit dem, was sie können tun? Wenn es möglich ist, dass ein Stapel die Argumentanalyse Ihres Codes durch Hinzufügen zusätzlicher Argumente vermasselt, lassen Sie ihn dann seinen Teil dazu beitragen, diese zusätzlichen Argumente während der Initialisierung zu entfernen. Was schadet es, wenn argc und argv an MPI_Init () übergeben werden? Warum nicht nochmal?
Bill Barth

1
(1) Ich verstehe Ihren Standpunkt zu den Umgebungsinformationen wirklich nicht. Wenn ich mpirun/ mpiexecmit einigen Parametern mpirunaufrufe , kann ich einige Umgebungsvariablen festlegen, bevor ich mein Programm starte, und diese dann von innen lesen MPI_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 .
Gnzlbg

2
Ich habe Ihre Bearbeitung verpasst, bevor ich das alles eingegeben habe. Mein Vorschlag ist, argc und argv an die Bibliothek zu übergeben, wenn sie MPI in Ihrem Namen initialisieren möchte. Das oder Benutzer müssen MPI_Init () und der Bibliothek den erforderlichen Kommunikator übergeben. Es ist möglicherweise nicht portierbar, MPI_Init () nicht mit argc und argv aufzurufen. Petsc unterstützt beispielsweise beide Stile.
Bill Barth

1
Die Unterstützung beider Stile scheint für jeden erforderlich zu sein, der einen MPI-Wrapper schreibt.
Gnzlbg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.