如果我有一个char数组,表示例如整数值,我用它通过MPI发送这些值,并使用适当的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;
}
这可以在不同架构/耐用的机器上移植吗?
我怀疑唯一不可移植的部分是从整数值到char数组的转换:
int i;
for(i = 0; i < sizeof(n); i++){
buff[i] = (n >> (8 * i)) & 0xFF;
}
但是,无论如何不是,有没有办法让上面的程序完全可移植,并且存在值数组的char数组?
答案 0 :(得分:0)
将整数序列化为缓冲区的方式不可移植。但是如果要发送整数,为什么不直接发送整数,只需考虑字节序。假设您要发送32位整数:
int n = 99;
int sent = htonl(n);
MPI_Send(&send, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
接收:
int n;
int recv;
MPI_Recv(&recv, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, NULL);
n = ntonl(recv);