2016-04-18 13 views
0

Wenn ich ein Char-Array, das zum Beispiel Ganzzahl-Werte darstellt, und ich habe es verwendet, um diese Werte über MPI mit dem entsprechenden MPI-Datentyp für Senden und Empfangen zu senden Operationen wie folgt: Portabilität des Sendens von Werten in Char Array mit MPI

int main(int argc, char* argv[]){ 

    int my_rank; /* rank of process */ 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

    unsigned char buff[100]; 

    if (my_rank == 0){ 
     int n = 99; 

     int i; 
     for(i = 0; i < sizeof(n); i++){ 
      buff[i] = (n >> (8 * i)) & 0xFF; 
     } 

     MPI_Send(&buff, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 
    } 
    else{ 
     MPI_Recv(&buff, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, NULL); 

     int n = *(int *)buff; 
     printf("%d\n", n); 
    } 

    /* shut down MPI */ 
    MPI_Finalize(); 

    return 0; 
} 

Ist das tragbare für Maschinen unterschiedlicher Architektur/endiness?

Ich vermute, der einzige Teil, der nicht tragbar ist die Umwandlung von Integer-Wert ist Array verkohlen:

int i; 
for(i = 0; i < sizeof(n); i++){ 
    buff[i] = (n >> (8 * i)) & 0xFF; 
} 

Aber sowieso, wenn nicht, ist es eine Möglichkeit, das obige Programm vollständig tragbar mit der Existenz zu machen des Char-Arrays, um Werte zu speichern?

+0

Die 'int n = * (int *) Buff;' Linie ist auch nicht tragbar. Abhängig von der Endlichkeit der Maschine und der "int" -Größe werden unterschiedliche Werte gedruckt. – atturri

+0

@atturri Ist es das? Die Verwendung von MPI_INT kümmert sich nicht darum, die Bytes korrekt im Puffer des Empfangsprozesses anzuordnen? – TuaimiAA

Antwort

0

Die Art, wie Sie ganze Zahlen in einen Puffer serialisieren, ist nicht übertragbar. Aber wenn Sie die ganze Zahl senden, warum senden Sie nicht ganze Zahlen direkt, nehmen Sie nur Endianness in Betracht. Angenommen, Sie möchten 32bits ganze Zahlen gesendet:

int n = 99; 
int sent = htonl(n); 
MPI_Send(&send, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 

für die Aufnahme:

int n; 
int recv; 
MPI_Recv(&recv, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, NULL); 
n = ntonl(recv);