在 cython 中使用 mpi4py

本文介绍了如何在 Cython 中使用 mpi4py 进行并行计算。从 Python 级别的 import 到 Cython 级别的 cimport,再到直接调用 MPI C 库,详细阐述了将 Python 通信子传递到 C 级别以及反之的过程,并提供了相关例程。
摘要由CSDN通过智能技术生成

本文从本人简书博客同步过来

上一篇中我们介绍了 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值