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?

确保mpiccmpirun来自相同的MPI实现 。 当mpirun未能向启动的进程提供必要的Universe信息时,最常见的原因是可执行文件是针对不同的MPI实现(甚至是相同实现的不同版本)构build的, MPI_Init()会回退到即所谓的单例MPI初始化,并创build一个仅包含调用过程的MPI_COMM_WORLD 。 因此,在自己独立的MPI_COMM_WORLD实例中产生了许多MPI进程。

通常命令如mpicc --showmewhich mpiccwhich mpirun可以帮助您确定是否确实如此。