MPI_Rank为所有进程返回相同的进程号
我试图在debian 7上用openmpi和mpirun运行这个示例hello world程序。
#include <stdio.h> #include <mpi/mpi.h> int main (int argc, char **argv) { int nProcId, nProcNo; int nNameLen; char szMachineName[MPI_MAX_PROCESSOR_NAME]; MPI_Init (&argc, &argv); // Start up MPI MPI_Comm_size (MPI_COMM_WORLD,&nProcNo); // Find out number of processes MPI_Comm_rank (MPI_COMM_WORLD, &nProcId); // Find out process rank MPI_Get_processor_name (szMachineName, &nNameLen); // Get machine name printf ("Hello World from process %d on %s\r\n", nProcId, szMachineName); if (nProcId == 0) printf ("Number of Processes: %d\r\n", nProcNo); MPI_Finalize (); // Shut down MPI return 0; }
我的问题是MPI_Comm_Rank
为进程的所有副本返回0。 当我在shell上运行这个命令时:
mpirun -np 4 helloWorld
它产生这个输出:
Hello World from process 0 on debian Number of Processes: 1 Hello World from process 0 on debian Number of Processes: 1 Hello World from process 0 on debian Number of Processes: 1 Hello World from process 0 on debian Number of Processes: 1
为什么进程数仍然是1?
确保mpicc
和mpirun
来自相同的MPI实现 。 当mpirun
未能向启动的进程提供必要的Universe信息时,最常见的原因是可执行文件是针对不同的MPI实现(甚至是相同实现的不同版本)构build的, MPI_Init()
会回退到即所谓的单例MPI初始化,并创build一个仅包含调用过程的MPI_COMM_WORLD
。 因此,在自己独立的MPI_COMM_WORLD
实例中产生了许多MPI进程。
通常命令如mpicc --showme
, which mpicc
和which mpirun
可以帮助您确定是否确实如此。