有一个简单的示例来描述我的问题。我有一个包含动态数组的自定义结构体。
struct my_data_type {
int c;
int d[];
};
根进程(进程0)有一个这样的结构体数组 nums[4]
。
我想通过 MPI_Scatter
将数组的块发送给不同的进程(例如,2个进程)。主要问题是我希望数组 d[]
是动态的。
主要代码如下:
int main(int argc, char* argv[]) {
MPI_Init(NULL, NULL);
int my_size; MPI_Comm_size(MPI_COMM_WORLD, &my_size);
int my_rank; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
int len = 2; //example: the dynamic array d contains len=2 elements
my_data_type *nums //nums[4]
= (my_data_type*)malloc((sizeof(my_data_type) + sizeof(int) * len) * 4);
my_data_type *sub_nums //sub_nums[2]
= (my_data_type*)malloc((sizeof(my_data_type) + sizeof(int) * len) * 2);
if (my_rank == 0) { //just some examples
nums[0].c = 0; nums[1].c = 1; nums[2].c = 2; nums[3].c = 3;
nums[0].d[0] = 10; nums[1].d[0] = 11; nums[2].d[0] = 12; nums[3].d[0] = 13;
nums[0].d[1] = 14; nums[1].d[1] = 15; nums[2].d[1] = 16; nums[3].d[1] = 17;
}
MPI_Datatype mpi_data_type; //new datatype
int blocklens[2];
MPI_Datatype old_types[2];
MPI_Aint indices[2];
blocklens[0] = 1; blocklens[1] = len;
old_types[0] = MPI_INT; old_types[1] = MPI_INT;
MPI_Address(&nums[0].c, &indices[0]);
MPI_Address(&nums[0].d[0], &indices[1]);
indices[1] = indices[1] - indices[0];
indices[0] = 0;
MPI_Type_create_struct(2, blocklens, indices, old_types, &mpi_data_type);
MPI_Type_commit(&mpi_data_type);
MPI_Scatter(nums, 2, mpi_data_type,
sub_nums, 2, mpi_data_type,
0, MPI_COMM_WORLD);
cout << "rank " << my_rank << ": " << endl;
cout << "c: " << sub_nums[0].c << ", " << sub_nums[1].c << endl;
cout << "d: " << sub_nums[0].d[0] << ", " << sub_nums[0].d[1] << ", ";
cout << sub_nums[1].d[0] << ", " << sub_nums[1].d[1] << endl;
MPI_Finalize();
return 0;
}
如果我将结构体
my_data_type
的定义中的 int d[];
改为 int d[2];
,那么我肯定会得到期望的结果。rank 0:
c: 0, 1
d: 10, 14, 11, 15
rank 1:
c: 2, 3
d: 12, 16, 13, 17
但如果没有,结果如下:
rank 0:
c: 0, 10
d: 10, 14, 14, 15
rank 1:
c: 33, 0
d: 0, 0, 0, 1
如您所见,我知道问题与动态数组有关,但在我的项目中我不能使用静态数组。那么我应该如何修改上述代码以获得预期结果?
d[]
,那么sizeof(...)
的结果将不是您所期望的,这会导致短小的 malloc 和数据损坏。 - Gilles Gouaillardetnums[4]
和sub_nums[4]
的内存)。但问题仍然存在。而且我无法分配动态数组d[]
,因为数组类型'int []'不可分配。 - Joxixi