2014-04-01 7 views
6

Angenommen, dass ich einen Strukturtyp haben wie folgt:MPI Verschiedene Methoden finden Verschiebungen

typedef struct { 
float x, y, z; 
float velocity; 
int n, type; 
} Particle; 

Ich möchte sie senden. Ich muss einen MPI_Type erstellen. Ich kenne 4 Möglichkeiten, es zu tun. Ich habe sie unten aufgelistet. Ich möchte wissen, was die Unterschiede, Grenzen und Vorteile von ihnen sind.

  1. MPI_Type_extent

  2. Mit offsetof() in stddef.h verwenden, wurde es in dieser Antwort erklärt: MPI Derived Type Send answer

  3. MPI_Get_address Verwendung, auch ein Beispiel in der gleichen Antwort.

  4. Mit reinterpret_cast<const unsigned char*>, ich habe nicht versucht, aber es ist ein Beispiel hier: MPI Create Custom Data

Antwort

2

Option 1 ist falsch gemäß der Antwort, die Sie verknüpfen.

Option 2 ist am einfachsten und hat den Vorteil, dass es sich um einen konstanten Ausdruck und nicht um einen Funktionsaufruf handelt.

Die Optionen 3 und 4 sind wahrscheinlich funktional identisch, aber 3 ist sicherer. Betrachte:

Hinweise für Benutzer.

C-Benutzer könnten versucht sein, die Verwendung von MPI_GET_ADDRESS zu vermeiden und sich auf die Verfügbarkeit des Adressoperators & zu verlassen. Beachten Sie jedoch, dass & Cast-Ausdruck ist ein Zeiger, keine Adresse. ISO C nicht erfordern, dass der Wert eines Zeigers (oder der Zeiger auf int) die absolute Adresse des Objekts, auf das gezeigt --- obwohl dies häufig der Fall ist. Darüber hinaus darf die Referenzierung keine eindeutige Definition auf Maschinen mit einem segmentierten Adressraum haben. Die Verwendung von MPI_GET_ADDRESS zur "Referenz" von C-Variablen garantiert Portabilität zu solchen Maschinen. (Ende der Beratung für die Nutzer.)

Quelle: http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report/node74.htm

Persönlich würde ich mit der Option 3, gehen Sie einfach absolut sicher zu stellen, dass die erhaltenen Werte kompatibel sein wird mit der anderen MPI aufruft. Vielleicht möchten Sie eine Funktion oder ein Makro ähnlich wie , die intern MPI_Get_address() verwendet.

+0

Während der Punkt im MPI-Standard für Zeiger gegen Adressen gültig ist, ist der Unterschied zwischen zwei Zeigern des gleichen Typs gut als Unterschied zwischen den Indizes der Elemente eines Arrays dieses Typs definiert, auf die die beiden Zeiger zeigen . Auch das ISO C++ gibt an, dass der Wert eines Zeigers die Adresse des Bytes im Speicher ist, wo der Objektspeicher startet (und diese Adresse wird bei Umwandlungen beibehalten, soweit ich den Standard verstehe), obwohl die tatsächliche Wertdarstellung eine Implementierung sein könnte -Spezifisch. Daher sollte # 4 ziemlich portabel sein. –