在Jupyter笔记本中使用`mpirun`

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

我有一个简单的C / MPI代码:

/* File: demo.c */
#include <stdio.h>
#include <mpi.h>

void main(int argc, char** argv)
{
    int my_rank,nprocs;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    printf("Processor [%d] : Hello, World! (world=%d processor(s))\n",my_rank,nprocs);
    MPI_Finalize();
}

当我在交互式Python shell中运行它时,我得到了预期的输出:

In [1]: !mpirun -n 4 demo
Processor [1] : Hello, World! (world=4 processor(s))
Processor [3] : Hello, World! (world=4 processor(s))
Processor [2] : Hello, World! (world=4 processor(s))
Processor [0] : Hello, World! (world=4 processor(s))

In [2]: 

但是,当我在Jupyter笔记本中运行相同的命令时,我得到了四个串行作业:

enter image description here

有没有更好的方法从笔记本中调用mpirun脚本?我已经尝试过%%bash魔法和子进程,但这些产生了相同的结果。

我有兴趣从笔记本电脑运行MPI代码作为收集运行时数据以存储和显示的简单方法。我对编写并行Python程序不太感兴趣。

我在OSX 10.13.2上运行Python 3.6.3(Anaconda)

ipython mpi jupyter-notebook jupyter
1个回答
0
投票

(部分)答案如下。由于我不完全理解的原因,Jupyter笔记本和交互式shell使用不同的搜索路径来查找mpirun

在IPython中:

In [1]: !type mpirun
mpirun is /opt/local/bin/mpirun

但在笔记本中,我有:

enter image description here

在bash提示符中使用此版本的mpirun,我得到:

(bash) $ /usr/local/Anaconda3/bin/mpirun -n 4 demo
Processor [0] : Hello, World! (world=1 processor(s))
Processor [0] : Hello, World! (world=1 processor(s))
Processor [0] : Hello, World! (world=1 processor(s))
Processor [0] : Hello, World! (world=1 processor(s))

从笔记本运行正确的版本,我得到了预期的结果。

enter image description here

我在两个版本(OpenMPI,由Anaconda安装)和MPICH(由MacPorts安装)之间存在不兼容性。使用mpicc从一个版本编译,并使用mpirun从另一个版本运行似乎是一个坏主意。

感谢@jakevdp为这个blog post指出了我正确的方向!

© www.soinside.com 2019 - 2024. All rights reserved.