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

MPI_Scatter: Why do I have to allocate memory in all the processes?

本文关键字:进程 内存 分配 Scatter 为什么 MPI      更新时间:2023-10-16

我正在使用MPI(在c ++中)并行化Conways's Game of Life。我必须从输入中读取一个(非常大的)矩阵,然后将其逐行分散在切片中,然后并行处理每个切片。我遵循的想法是只让一个进程处理 I/O 内容。特别是,过程 0 从文件中读取并将初始数据保存到 RxC 矩阵中,以分散在 (R/P)xC"切片矩阵"中的过程之间。现在,当我执行例程MPI_Scatter时,编译器会抱怨,因为"大矩阵"仅在第一个进程中分配。为了使事情顺利进行,我必须在所有过程中分配大矩阵,即使它们仍然是空白的。这是普通的,还是我做错了什么?有没有办法避免为每个进程分配一个空白的、无用的矩阵?谢谢你们!

你不需要

在任何地方分配"大矩阵",但MPI_SCATTER确实需要你在所有等级上分配一些内存。

如果要像这样分散数据:

散射前:

rank 0 - 1 2 3 4

散射后:

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

您需要为每个等级上的一个int分配空间(而不是所有 4 个)。

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

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++ 中的某些内容。