这是一个非常基本的MPI问题,但我无法理解它。我有一个main函数调用另一个使用MPI的函数。我希望main函数以串行方式执行,而另一个函数并行执行。我的代码是这样的:
int main (int argc, char *argv[])
{
//some serial code goes here
parallel_function(arg1, arg2);
//some more serial code goes here
}
void parallel_function(int arg1, int arg2)
{
//init MPI and do some stuff in parallel
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
//now do some parallel stuff
//....
//finalize to end MPI??
MPI_Finalize();
}
我的代码运行正常并获得预期的输出,但问题是主函数也在不同的进程中运行,因此串行代码执行多次。我不知道它是如何多次运行的,因为我还没有调用MPI_Init(如果在调用parallel_function之前我在main中打印,我会看到多个printf)
我完成后如何让我的程序并行运行?
感谢您的回复!
答案 0 :(得分:10)
查看this answer。
短篇小说:MPI_Init
和MPI_Finalize
不标记并行处理的开始和结束。 MPI流程完全并行运行。
答案 1 :(得分:9)
@suszterpatt指出“MPI进程完全并行运行”是正确的。当您使用例如mpirun
或mpiexec
运行并行程序时,这将启动您请求的进程数(带有-n
标志),并且每个进程在{的开始处开始执行{1}}。所以在你的示例代码中
main
每个流程都会执行int main (int argc, char *argv[])
{
//some serial code goes here
parallel_function(arg1, arg2);
//some more serial code goes here
}
和//some serial code goes here
部分(当然,他们都会调用//some more serial code goes here
)。没有一个主进程调用parallel_function
,然后在调用parallel_function
后生成其他进程。
通常最好避免做你正在做的事情:MPI_Init
应该是程序中的第一个函数调用之一(理想情况下它应该是第一个)。特别注意以下内容(来自here):
MPI标准没有说明程序在MPI_INIT之前或MPI_FINALIZE之后可以执行的操作。在MPICH实现中,您应该尽可能少地执行。特别是,避免任何改变程序外部状态的事情,例如打开文件,读取标准输入或写入标准输出。
不尊重这会导致一些令人讨厌的错误。
最好将代码重写为以下内容:
MPI_Init
注意:我不是C程序员,所以请小心使用上面的代码。此外,int main (int argc, char *argv[])
{
// Initialise MPI
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
// Serial part: executed only by process with rank 0
if (my_rank==0)
{
// Some serial code goes here
}
// Parallel part: executed by all processes.
// Serial part: executed only by process with rank 0
if (my_rank==0)
{
// Some more serial code goes here
}
// Finalize MPI
MPI_Finalize();
return 0;
}
不应该总是返回一些内容,特别是定义为main
时?