使用MPI发送存储在char数组中的值的可移植性

时间:2016-04-18 10:35:59

标签: c mpi

如果我有一个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数组?

1 个答案:

答案 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);