MPI_Scatter:为什么必须在所有进程中分配内存
MPI_Scatter: Why do I have to allocate memory in all the processes?
我正在使用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++ 中的某些内容。
相关文章:
- 可以读入进程内存的最大块大小是多少?
- 如何读取特定地址的进程内存?
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 读取进程内存多级指针(DLL 注入)
- 读取进程内存作弊引擎值
- 获取进程内存信息失败,错误 6 句柄无效
- c++ 读取进程内存基址 + 偏移量不起作用
- 如何编辑受保护的进程内存?
- 内核模式驱动程序可以在任何进程上执行读取进程内存吗?
- 如何获取进程内存的最小值和最大值?(C++)
- C++ - 读取进程内存到缓冲区,写入进程内存(同一缓冲区上的新值)将缓冲区恢复为旧值
- 读取进程内存 C++ 不会读取
- 尝试编写进程内存并获取用户定义的文字运算符未找到
- 具有多个偏移量的写入进程内存C++
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- 读取进程内存无法正常工作,使用 UTF16 字符串
- 读取进程内存上的错误 299
- 写入进程内存没有错误,它不会写入正确的地址
- 将进程内存转储到文件/从转储文件重新创建进程