【发布时间】:2020-11-20 17:10:30
【问题描述】:
我为图像处理过滤器编写了一个 MPI 程序。该程序的主要目标是使用并行计算将给定的过滤器应用于图像文件。
MPI 程序运行良好,没有任何问题。
现在我想为我的 MPI 程序使用 Master-Worker-Model。 经过一番研究,我发现 MPI_Scatter 和 MPI_Gather 是我需要的命令。
但我不太明白它们是如何工作的。这是我第一次尝试编写代码:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv)
{
// Filters
MPI_Init(&argc, &argv);
if(parent == MPI_COMM_NULL)
{
MPI_Scatter(); // What are the parameters?
// Master reads in the image file and distribute it to the workers.
MPI_File_open();
MPI_File_read();
MPI_File_close();
}
else
{
// After receiving data from the master, worker processes begin their job.
/* Normally here would be the entire logic of this program.*/
/* For simplicity I just skip it for readability.*/
/* The calculcation is exclusively up to the workers.*/
}
// After finishing, the results will be sent back to the master.
MPI_Gather(); // What are the parameters?
MPI_Finalize();
return 0;
}
它不会运行,因为它只是第一个原型。我想知道的是我是否理解了Master-Worker-Model的概念。
对代码的一些反馈会很有帮助。
提前致谢。
【问题讨论】:
-
据我了解,
MPI_Comm_spawn只是创建同一程序的多个副本,并在它们之间建立通信并返回一个相互通信器(可能是一些用于与这些副本通信的对象)(在@987654324 之前使用@?)MPI_Barrier是一个阻塞代码,它将阻塞进程直到所有进程都到达某个指定点(称为特定函数)(在MPI_Gather? 之前使用)。我无法理解这个:MPI_Intercomm_merge。不过,我的理解可能是错误的。 -
MPI standard document 有一个经理-工人计划的示例(第 10.3.5 节 - 第 383 页)。该示例显示了一个程序如何从仅 1 个进程(管理器)开始创建/生成另一个进程(工作器)并与之交互。一旦创建了工作进程,程序的其余部分将与任何其他 MPI 程序相同。您可以轻松扩展该示例以创建多个工作人员。
-
如果你的程序只在一台主机上运行(例如你不做分布式计算),我认为多线程会更适合和更容易地解决你的问题。
-
MPI 非常不适合图像处理。特别是如果您的图像只有 1k 像素宽。与您正在执行的大多数计算相比,发送数据需要更多时间。
-
@Aziz 我意识到了这个例子。我的问题是没有
MPI_Scatter和MPI_Gather用于向工作人员分发数据。此外,有人告诉我必须使用MPI_Intercomm_merge。我的 MPI 程序比这个例子更复杂。
标签: c image-processing parallel-processing mpi broadcast