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