MPI只识别C中的1个进程?

时间:2017-03-03 19:21:17

标签: c multithreading mpi

我正在学习用于C语言并行编程的MPI,我使用的是4核处理器。我试图从一个教程中做一个例子,输出应该是:

Hello world! I'm process 0 out of 4 processes
Hello world! I'm process 2 out of 4 processes
Hello world! I'm process 1 out of 4 processes
Hello world! I'm process 3 out of 4 processes

无论什么顺序。

这是我的代码:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char** argv)
{
  int ierr, num_procs, my_id;
  ierr = MPI_Init(&argc, &argv);

  ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
  ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

  printf("Hello world! I'm process %i out of %i processes\n", my_id, num_procs);
  ierr = MPI_Finalize();
}

我使用以下方法编译它:

mpicc helloworld.c -o helloworld

我用它来运行:

mpirun -np 4 helloworld

这是输出的内容:

Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes

它输出了4次这是相对好消息我猜,但程序没有识别线程数和每个线程ID。

它甚至是并行运行还是仅连续运行4次? 如何让程序正确识别线程数和线程ID?

提前致谢!

1 个答案:

答案 0 :(得分:0)

mpicc helloworld.c -o helloworld

mpirun -np 4 helloworld

Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes

此序列清楚地向我们显示您的MPI运行时无法检测到并行启动,可能是由于配置错误:您的mpicc来自一个MPI实施而mpirun来自其他实施。例如,MPICH和OpenMPI都有mpicc脚本用于编译MPI程序,但它们的mpiexec / mpirun程序不兼容。使用MPICH进行编译,从OpenMPI启动器开始,MPICH运行时将不会收到所需的环境变量来计算并行运行及其参数。

您应该重新访问已安装软件包的列表(dpkg -l|egrep 'mpich|openmpi')并检查哪个文件来自哪个库(dpkg -L mpichdpkg -L openmpi-bin; dpkg -L libmpich-devdpkg -L libopenmpi-dev) 。 Ubuntu / debian也有&#34;替代品&#34;这会将符号链接mpiccmpirun安装到实际脚本中(执行ls -l /usr/bin/mpicc /usr/bin/mpirun以查看链接的当前状态)。检查update-alternatives工具,man pagedocs,了解如何将所有mpi命名的脚本重置为一个实现(并且有galternatives GUI。)

根据包中的文件列表,mpich和openmpi有mpirun / mpiexec的变体,后缀为http://packages.ubuntu.com/yakkety/amd64/openmpi-bin/filelist http://packages.ubuntu.com/yakkety/amd64/mpich/filelist

/usr/bin/mpiexec.openmpi
/usr/bin/mpirun.openmpi
/usr/bin/mpiexec.hydra
/usr/bin/mpiexec.mpich
/usr/bin/mpirun.mpich

mpicc脚本的情况相同:http://packages.ubuntu.com/yakkety/amd64/libopenmpi-dev/filelist http://packages.ubuntu.com/yakkety/amd64/libmpich-dev/filelist

/usr/bin/mpicc.openmpi
/usr/bin/mpicc.mpich

始终使用同一实现中的mpicc和mpirun(或mpiexec)。您也可以使用带后缀的变体来确定:mpicc.openmpi&amp; mpiexec.openmpi对或mpicc.mpich&amp; mpiexec.mpich对。

要使用一些MPI实现,你应该完全安装它,包括bin,lib和dev包。