2017-06-12 2 views
-5

Ich schreibe eine type_traits-Bibliothek für mpi, aber wenn ich "float int" als ein Typ für MPI_FLOAT_INT definiere, bekomme ich zwei oder mehr Variablentypen in Deklarationsfehler, was ist der äquivalente Typ von MPI_FLOAT_INT in C++?was ist der C++ äquivalente Typ, wenn MPI_FLOAT_INT

Antwort

1

Die einzige maßgebliche Quelle, die MPI standard, definiert als MPI_FLOAT_INT (Abschnitt 5.9.4 MINLOC und MAXLOC):

Der Datentyp MPI_FLOAT_INT ist als ob def durch die folgende Reihenfolge von Anweisungen.

type[0] = MPI_FLOAT 
type[1] = MPI_INT 
disp[0] = 0 
disp[1] = sizeof(float) 
block[0] = 1 
block[1] = 1 
MPI_TYPE_CREATE_STRUCT(2, block, disp, type, MPI_FLOAT_INT) 

ähnliche Aussagen gelten für MPI_LONG_INT und MPI_DOUBLE_INT.

Es bedeutet, dass der Typ struct { float a; int b; } entspricht, aber nur, wenn es keine Garantie, dass padding Raum zwischen a und b eingesetzt ist. Dies ist möglicherweise auf Systemen nicht der Fall, bei denen int 64-Bit ist und auf 8 Bytes ausgerichtet werden muss. Man könnte den Compiler anweisen müssen, gepackte Strukturen, z. mit GCC:

#pragma pack(push, 1) 
struct float_int 
{ 
    float a; 
    int b; 
} 
#pragma pack(pop) 

Beachten Sie, dass MPI_FLOAT_INT um in MINLOC und MAXLOC Senkungen verwendet werden soll, um herauszufinden, sowohl die min/max float Wert und den niedrigsten Nummer Rang, die es hält.

2

Nach den documentation:

MPI_FLOAT_INT
Dies ist ein Paar aus einem durch eine 32-Bit-Ganzzahl, gefolgt Gleitkommazahl 32-Bit ist.

Ein Äquivalent wäre std::pair<float, int> oder struct float_int{ float f; int i;};.

Sie können versuchen, ein bisschen besser mit int32_t anstelle von int und static_assert(sizeof(float) == 4); in einem Versuch, die richtige Größe zu bekommen.

+0

Das ist nicht die offizielle MPI-Spezifikation. MPI gibt nicht die Anzahl der Bytes in einem int oder float vor. –

0

Nach Linux man page ist MPI_FLOAT_INT eine Struktur wie folgt definiert:

struct { float, int }

Verwandte Themen