在上一篇中我们介绍了 mpi4py 中的 run 模块,下面我们将介绍在 cython 中使用 mpi4py。
cython 简介
Cython 是 Python 编程语言的超集,旨在通过主要使用 Python 编写的代码提供类似 C 的性能。Cython 是一种生成 CPython 扩展模块的编译语言,用 Cython 编写 Python 的扩展模块与直接写 Python 程序差不多一样容易。然后,可以使用 import 语句通过常规 Python 代码加载和使用这些扩展模块。几乎所有 Python 代码都是合法的 Cython 代码。
使用 Cython 一般只需在对应的 Python 代码中可选地添加一些静态类型声明,然后就可以使用 Cython 编译器将其转换成优化的 C/C++ 代码,然后被 C 编译器(如 gcc 等)编译成 Python 的扩展模块。这些扩展模块可以在 Python 中直接导入使用。
读者可以参考其文档以了解更多关于 Cython 的内容及其使用方法。
在 cython 中使用 mpi4py
在前面已经提到过,mpi4py 的主体部分是使用 Cython 编写的,因此在 Cython 中使用 mpi4py 也是非常自然和非常容易的。根据所编写的代码更接近 Python 还是更接近 C,在 Cython 中使用 mpi4py 可以在 3 个级别上进行。
Python 级别 import
因为 Python 代码(在绝大多数情况下)也是合法的 cython 代码,因此直接将一段使用 mpi4py 的 Python 代码放入一个 *.pyx 文件中,就成了相应的 Cython 代码。在这个级别上,编译成的扩展模块链接使用的是 mpi4py/MPI.so。下面是简单的例子:
# Python-level module import
# (file: mpi4py/MPI.so)
from mpi4py import MPI
# Python-level objects and code
size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
pname = MPI.Get_processor_name()
hwmess = "Hello, World! I am process %d of %d on %s."
print (hwmess % (rank, size, pname))
Cython 级别 cimport
在这个级别上必须从 mpi4py 包中 cimport MPI 模块,然后可以使用和添加一些 mpi4py 中的 Python 扩展类型(在 mpi4py/include/mpi4py/MPI.pxd 中定义),下面是简单的例子:
# Cython-level cimport
# this make available mpi4py's Python extension types
# (file: mpi4py/include/mpi4py/MPI.pxd)
from mpi4py cimport MPI
from mpi4py.MPI cimport Intracomm as IntracommType
# C-level cdef, typed, Python objects
cdef MPI.Comm WORLD = MPI.COMM_WORLD
cdef IntracommType SELF = MPI