MPI_Scatter:为什么我必须在所有进程中分配内存?

时间:2014-02-14 20:35:17

标签: c++ matrix parallel-processing mpi scatter

我正在处理使用MPI(在c ++中)并行Conways的生命游戏。我必须从输入读取一个(非常大的)矩阵,然后按行逐行散布,然后并行处理每个切片。我遵循的想法是只让一个进程处理I / O的东西。具体地,过程0从文件读取并将初始数据保存到说RxC矩阵中,以在(R / P)xC“切片矩阵”中的过程中分散。 现在,当我执行例程MPI_Scatter时,编译器会投诉,因为“大矩阵”仅在第一个进程中分配。为了使事情有效,我必须在所有过程中分配大矩阵,即使这些矩阵仍然是空白的。这是普通的,还是我做错了什么?有没有办法避免为每个进程分配一个空白,无用的矩阵? 谢谢你们!

2 个答案:

答案 0 :(得分:2)

您无需在任何地方分配“大矩阵”,但MPI_SCATTER确实要求您在所有等级上分配一些内存。

如果您要分散这样的数据:

分散之前:

rank 0 - 1 2 3 4

分散后:

rank 0 - 1
rank 1 - 2
rank 2 - 3
rank 3 - 4

你需要在每个等级上为一个int分配空间(而不是全部4个)。

答案 1 :(得分:0)

您不必在任何地方分配大矩阵,但需要在任何地方声明大矩阵变量。试试这个:

int* big_matrix;
if(process_id == 0) {
    big_matrix = (int*) malloc(big_number * sizeof(int));
    // fill the big matrix with values
}
int* part_of_matrix = (int*) malloc(small_number * sizeof(int));
MPI_Scatter(big_matrix, small_number, MPI_INT, part_of_matrix, small_number, MPI_INT, 0, MPI_COMM_WORLD);

至少这是一种在C中执行此操作的方法。您可能必须将big_matrix初始化为0或C ++中的某些内容。