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

问题描述 投票:0回答:2

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

提前致谢!

c multithreading mpi
2个回答
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
来自另一个 MPI 实现。例如,MPICH和OpenMPI都有用于编译MPI程序的
mpicc
脚本,但它们的
mpiexec
/
mpirun
程序不兼容。使用 MPICH 进行编译,使用 OpenMPI 启动器启动,MPICH 运行时将不会接收所需的环境变量来确定并行运行及其参数。

您应该重新访问已安装的软件包列表 (

dpkg -l|egrep 'mpich|openmpi'
) 并检查哪个文件来自哪个库 (
dpkg -L mpich
,
dpkg -L openmpi-bin
;
dpkg -L libmpich-dev
,
dpkg -L libopenmpi-dev
)。 Ubuntu/debian 也有“替代”系统,它将安装符号链接
mpicc
mpirun
到实际脚本(执行
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
&
mpiexec.openmpi
对或
mpicc.mpich
&
mpiexec.mpich
对。

要使用一些 MPI 实现,您应该完全安装它,无论是 bin、lib 还是 dev 包。


0
投票

我在使用 2023 年 6 月的 MS-MPI v10.1.3 的 Windows 中遇到了同样的问题,我通过使用 2019 年 11 月的先前版本 MS-MPI v10.1.2 解决了。 这是我正在使用的代码:

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

int main(int argc, char* argv[]) {

int my_rank;
int world_size;

MPI_Init(NULL, NULL);

MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

std::cout << "Hello World from process " << my_rank << " out of " << world_size << " processes!!!" << std::endl;

MPI_Finalize();
return 0;
}

这是 mpiexec -n 6 helloWorld.exe 的结果:

Hello World from process 1 out of 6 processes!!!
Hello World from process 2 out of 6 processes!!!
Hello World from process 5 out of 6 processes!!!
Hello World from process 3 out of 6 processes!!!
Hello World from process 0 out of 6 processes!!!
Hello World from process 4 out of 6 processes!!!
© www.soinside.com 2019 - 2024. All rights reserved.