在Jupyter笔记本中使用`mpirun`

时间:2018-02-10 18:47:48

标签: ipython mpi jupyter-notebook jupyter

我有一个简单的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)

1 个答案:

答案 0 :(得分: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

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

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