我需要能够从排名0发送和接收两个uint64_t数组到所有排名。
我有一个如下的typedef结构:
typedef struct _mpi_data_t {
uint64_t *array1;
uint64_t *array2;
size_t array1_size;
size_t array2_size;
} mpi_data_t;
在rank 0中,我填充数组并计算位移以创建MPI数据类型。
MPI_Get_address(&mpi_data_send, &address[0]);
MPI_Get_address(&mpi_data_send.array1[0], &address[1]);
MPI_Get_address(&mpi_data_send.array2[0], &address[2]);
MPI_Get_address(&mpi_data_send.array1_size, &address[3]);
displacements[0] = address[1] - address[0];
displacements[1] = address[2] - address[0];
displacements[2] = address[3] - address[0];
我将块计数数组设置如下:
我也将块计数数组设置如下:
int block_count[3] = {mpi_data_send.array1_size, mpi_data_send.array2_size, 2};
我的问题是,当接收到这种数据类型时,其他进程无法使用相同的位移和块计数创建相同的数据类型规范,因为数组是由发送方(rank 0)生成的。
我该如何发送和接收这两个动态大小的数组?