if you can use mpi for python

主要是介绍在python中如何使用mpi以及如何将其中的communicator实例传递给 c code

之前项目的interface是c的,提供了一些c和fortran的interface 但是obviously要想让这种in-memory的staging项目使用的更方便,显然是需要和python这种 high expressive(compare with c) 语言来结合,目前好多library的方式都是上层用Python,内核使用c或者更高效的语,就像pytorch这种,这让我觉得python对于底层库的wrapper的技术是个lucrative的事情,算是表达能力与易用性的某种结合。

对于mpi4py本身的使用上来看,文档里已经说明的很详细了。

对于从python code 中传递mpi communicator给c,主要使用的是两种方式,一个是通过swig比如这个例子 另外一个是直接通过ctypes然后自己写函数进行转换,比如这个例子 在最本质上,都是将一个python的object转化成为一个c的objct,只不过使用swig的话,中间有些过程被自动完成了。

常见的using case

安装使用过程中遇到的问题

具体可以参考这个

一个是

1
relocation R_X86_64_32S against `_Py_NotImplementedStruct' can not be used when making a shared object

据说是应为编译python的时候没有加上shared enable的flag,后来在我们自己的系统上根据matainer的提示,去掉demon中python-config脚本的这一行

1
libs.append('-lpython' + pyver + abiflags)

就是说-shared参数后面不使用-l参数去找python的链接库,这样直接编译也没问题,但是还是不知道为什么会这样,感觉就是在编译的时候不需要将python通过动态链接的方式放进来,如果加上的话,再使用ldd会出现如下的结果

1
libpython3.5m.so.1.0 => /sw/xk6/python/3.5.1/sles11.3_gnu4.9.0/lib/libpython3.5m.so.1.0

但是不加的话也能正常运行,具体原理是什么还不太清楚

另外一个是在调用mpi方法的时候会出现

1
Attempting to use an MPI routine before initializing MPICH

这个原因住主要是两个库(一个是通过swig/mpi4py编译好的python的extension,另一个是mpi4py本身所使用的MPI.so</site-packages/mpi4py/>)在使用dynamic link的时候链接了不同的底层mpi库,就是没有使用同一个mpi library所导致的。

推荐文章