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?
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
@atturri Ist es das? Die Verwendung von MPI_INT kümmert sich nicht darum, die Bytes korrekt im Puffer des Empfangsprozesses anzuordnen? – TuaimiAA