【问题标题】:MPI only recognising 1 process in C?MPI 仅识别 C 中的 1 个进程?
【发布时间】:2017-07-24 00:47:31
【问题描述】:

我正在学习使用 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?

提前致谢!

【问题讨论】:

  • 您使用的是哪个 MPI 库?
  • mpich。我通过 sudo apt-get mpich 获得的库。除此之外,我什么也没做。 @arash
  • 请检查您使用的mpirun 确实来自同一个 MPI 库 mpich(提供 mpicc),而不是来自 openmpi。 (mpich 有mpiexec,openmpi 有mpirun;脚本使用的环境变量集不同,因此 mpirun 无法保证程序是并行启动的)。
  • 我该怎么做?一般来说,我对 MPI 和并行编程真的很陌生,我找不到任何可以教我如何设置它的地方。我也尝试过使用相同参数的 mpiexec,但它产生了相同的结果
  • 在终端中:mpirun --version 应该会给你一些信息

标签: c multithreading mpi


【解决方案1】:
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 都有用于编译 MPI 程序的mpicc 脚本,但它们的mpiexec/mpirun 程序不兼容。使用 MPICH 编译,使用 OpenMPI starter 启动,MPICH 运行时将不会接收需要的环境变量来计算并行运行及其参数。

您应该重新访问已安装软件包的列表 (dpkg -l|egrep 'mpich|openmpi') 并检查哪个文件来自哪个库 (dpkg -L mpich, dpkg -L openmpi-bin; dpkg -L libmpich-dev, dpkg -L libopenmpi-dev)。 Ubuntu/debian 也有“alternatives”系统,它将安装符号链接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/filelisthttp://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/filelisthttp://packages.ubuntu.com/yakkety/amd64/libmpich-dev/filelist

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多