我正在学习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
来自另一个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还具有“替代”系统,该系统将把符号链接(symbolic link)mpicc
和mpirun
安装到实际脚本中(执行ls -l /usr/bin/mpicc /usr/bin/mpirun
以查看链接的当前状态)。检查update-alternatives
工具,其man page和docs,以了解如何将所有以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软件包完全安装它。