MPI_Rank 为所有进程返回相同的进程号

Posted

技术标签:

【中文标题】MPI_Rank 为所有进程返回相同的进程号【英文标题】:MPI_Rank return same process number for all process 【发布时间】:2013-12-15 18:09:44 【问题描述】:

我正在尝试在 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?

【问题讨论】:

你用什么命令编译helloWorld? 我知道这有点晚了,但 mpicc helloWorld.c 通常会创建一个名为 a.out 的可执行文件。 mpicc -o helloWorld helloWorld.c 将创建一个名为 helloWorld 的可执行文件。 【参考方案1】:

确保mpiccmpirun 来自相同的 MPI 实现。当mpirun 无法为启动的进程提供必要的 Universe 信息时,最常见的原因是可执行文件是针对不同的 MPI 实现(甚至是同一实现的不同版本)构建的,MPI_Init() 会失败回到所谓的单例 MPI 初始化,并创建一个只包含调用进程的MPI_COMM_WORLD。因此,结果是许多 MPI 进程在它们自己的独立 MPI_COMM_WORLD 实例中。

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

【讨论】:

which mpicc 和 which mpirun 都返回 /usr/bin/mpicc 和 /usr/bin/mpirun 您使用的是哪种 MPI 实现? 我正在使用 libopenmpi-dev 我遇到了同样的问题。删除 openmpi 并仅使用 mpich 解决了我的问题。 我在 Mint 17 上安装了 openmpi 和 mpich - 并使用 update-alternatives --configure mpi 在它们之间切换。但是,这不会切换 mpiexec 实现,您还必须为此执行update-alternatives --configure mpirun

以上是关于MPI_Rank 为所有进程返回相同的进程号的主要内容,如果未能解决你的问题,请参考以下文章

pidof命令

Linux0号进程,1号进程,2号进程

Linux0号进程,1号进程,2号进程

MPI_Barrier - 只有一些进程通过屏障

python 多线程和多进程的区别 mutiprocessing theading

linux 下查看进程用啥命令