2017-03-03 63 views
2

我正在学习C语言并行编程的MPI,我正在使用一个4核处理器。我正尝试从输出应该是教程做一个例子:MPI只识别C中的一个进程?

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?

提前致谢!

+2

您正在使用哪个MPI库? – Arash

+0

mpich。我通过sudo apt-get mpich获得的库。除此之外,我还没有做过任何事情。 @arash –

+1

请检查您使用的mpirun是否来自相同的MPI库mpich(它提供了mpicc),而不是来自openmpi。 (mpich有'mpiexec',openmpi有'mpirun';脚本使用的一组环境变量是不同的,所以mpirun不能保证程序并行启动)。 – osgx

回答

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是从其他。例如,MPICH和OpenMPI都有用于编译MPI程序的mpicc脚本,但它们的mpiexec/mpirun程序不兼容。使用MPICH进行编译,从OpenMPI启动程序开始,MPICH运行时将不会收到所需的环境变量以找出并行运行及其参数。

您应该重新安装的软件包(dpkg -l|egrep 'mpich|openmpi')的清单,并检查该文件是从哪个库(dpkg -L mpichdpkg -L openmpi-bin; dpkg -L libmpich-devdpkg -L libopenmpi-dev)。 Ubuntu/debian也有“替代品”系统,它将符号链接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变型:用于mpicc脚本

/usr/bin/mpiexec.openmpi 
/usr/bin/mpirun.openmpi 
/usr/bin/mpiexec.hydra 
/usr/bin/mpiexec.mpich 
/usr/bin/mpirun.mpich 

同样的情况: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软件包。