gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:11 32 4
gpt4 key购买 nike

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

提前致谢!

最佳答案

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 也有“替代”系统,它将安装符号链接(symbolic link) mpiccmpirun 到实际脚本(执行 ls -l/usr/bin/mpicc/usr/bin/mpirun 查看链接的当前状态)。检查 update-alternatives 工具,它的 man pagedocs了解如何将所有以 mpi 命名的脚本重置为一个实现(并且有 galternatives GUI 用于它)。

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

关于c - MPI 只识别 C 中的 1 个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42586832/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com