我有一个简单的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笔记本中运行相同的命令时,我得到了四个串行作业:
有没有更好的方法从笔记本中调用mpirun
脚本?我已经尝试过%%bash
魔法和子进程,但这些结果会产生相同的结果。
我有兴趣从笔记本电脑运行MPI代码,这是收集运行时数据以便存储和显示的简便方法。我对编写并行Python程序不太感兴趣。
我在OSX 10.13.2上运行Python 3.6.3(Anaconda)
答案 0 :(得分:0)
(部分)答案如下。由于我不完全理解的原因,Jupyter笔记本和交互式shell使用不同的搜索路径来查找mpirun
。
在IPython中:
In [1]: !type mpirun
mpirun is /opt/local/bin/mpirun
但在笔记本中,我有:
在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))
从笔记本运行正确的版本,我得到了预期的结果。
我在两个版本(由Anaconda安装的OpenMPI)和MPICH(由MacPorts安装)之间存在不兼容性。使用mpicc
从一个版本进行编译,并使用其他版本的mpirun
运行似乎是一个坏主意。
感谢@jakevdp为这个blog post指出了正确的方向!