MPI仅识别C中的1个进程?
我正在学习C语言并行编程的MPI,我正在使用一个4核处理器。我试图从一个教程中做一个示例,其中的输出应该是:MPI仅识别C中的1个进程?,c,multithreading,mpi,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 以任何顺序 这是我的
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
来自另一个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
(dols-l/usr/bin/mpicc/usr/bin/mpirun
,以查看链接的当前状态)。检查updatealternatives
tool,了解如何将所有mpi命名脚本重置为一个实现(并且有galtentives
GUI)
根据软件包中的文件列表,mpich和openmpi具有带有后缀的mpirun/mpiexec变体:
mpicc脚本的情况相同:
始终使用来自同一实现的mpicc和mpirun(或mpiexec)。您还可以使用带有后缀的变体来确保:mpicc.openmpi
&mpiexec.openmpi
pair或mpicc.mpich
&mpiexec.mpich
pair
要使用一些MPI实现,您应该完全安装它,包括bin、lib和dev包。您使用的是哪个MPI库?mpich。我通过sudo找到的图书馆很容易得到mpich。除此之外,我什么也没做过@请检查您使用的
mpirun
是否确实来自同一个MPI库mpich(提供mpicc),而不是来自openmpi。(mpich有mpiexec
,openmpi有mpirun
;脚本使用的环境变量集不同,因此mpirun无法确保程序处于并行启动状态)。我该如何做?一般来说,我对MPI和并行编程非常陌生,我找不到任何地方教我如何设置它。我也尝试过使用相同参数的mpiexec,但它在终端中产生相同的结果:mpirun--version
应该会提供一些信息
/usr/bin/mpiexec.openmpi
/usr/bin/mpirun.openmpi
/usr/bin/mpiexec.hydra
/usr/bin/mpiexec.mpich
/usr/bin/mpirun.mpich
/usr/bin/mpicc.openmpi
/usr/bin/mpicc.mpich