使用MPI在顺序和并行之间切换

rks*_*171 1 mpi

我有一个代码来计算一些导体中的热传递.在一个导体中发生的事情不会影响模型中的其他导体.所以我试图让这些导体的解决方案并行运行,每个处理器采用不同的导体组.现在,我认为代码可以在一个核心上运行,直到它到达我放置命令的循环:

MPI_INIT
Run Code Online (Sandbox Code Playgroud)

然后运行的代码.但是多核心我要求再回去的命令后一个内核上运行此部分:

MPI_FINALIZE
Run Code Online (Sandbox Code Playgroud)

遇到了.但我所看到的是输入文件由两个内核读入(如果我使用2个内核),并且所有输出也被打印两次.MPI不能像我想的那样工作吗?如果没有,那么我怎样才能实现我想要的行为呢?我只希望代码的一个段在多个内核上运行代码,而不是在MPI_INIT和MPI_FINALIZE之外的任何其他子例程或代码部分中运行.

Jon*_*rsi 8

这是一种常见的误解,特别是在具有OpenMP之类的经验的人中,其中线程在程序的各个点分叉和连接.

在MPI,MPI_InitMPI_Finalize初始化并完成您的MPI库; 而已.虽然标准是有目的地保证在Init之前和Finalize之后发生的事情,但作为一个实际问题,你mpirun或者mpiexec命令通常会创建和启动进程.如果你输入

mpirun -np 4 hostname
Run Code Online (Sandbox Code Playgroud)

例如,启动了四个进程,每个进程都运行hostname命令 - 这绝对不是MPI可执行文件,并且没有任何MPI_InitMPI_Finalize调用.每个进程都运行可执行文件,从头到尾,因此您将获得四个输出.它是启动进程的mpirun(或mpiexec),而不是程序内的任何MPI函数调用.

然后,在您的程序中,整个程序将由您请求的多个进程运行.