在 HPC 平台上执行 Python 的子集
项目描述
Compyle 允许用户在各种 HPC 平台上执行 Python 的受限子集(几乎类似于 C)。目前,我们支持使用 Cython 执行多核 CPU,而对于 GPU 设备,我们使用 OpenCL 或 CUDA。
用户从以非常受限的 Python 语法实现的代码开始,然后自动转译、编译和执行此代码,以在一个 CPU 内核或多个 CPU 内核(通过OpenMP)或 GPU 上运行。Compyle 提供源到源的转换,使其成为编写 HPC 库的非常方便的工具。
提供了一些简单但功能强大的并行实用程序,可以让您解决大量有趣的 HPC 问题。Compyle 还具有 JIT 转译功能,使其易于使用。
文档和学习材料也以以下形式提供:
在我们的SciPy 2020 论文中介绍了在编写并行分子动力学模拟器的背景下编译。
您也可以在Google Colab 笔记本上免费在线试用 Compyle 。
虽然 Compyle 看起来很简单,但它并不是一个玩具,它被 Compyle 起源的PySPH项目大量使用。
安装
Compyle 本身在很大程度上是纯 Python,但依赖于numpy,并且需要Cython或PyOpenCL或PyCUDA以及 C/C++ 编译器、OpenCL 和 CUDA 的相应后端。如果您只想在 CPU 上执行代码,那么您只需要 Cython。
您应该能够通过执行以下操作来安装 Compyle:
$ pip install compyle
一个简单的例子
这是一个非常简单的例子:
from compyle.api import Elementwise, annotate, wrap, get_config import numpy as np @annotate def axpb(i, x, y, a, b): y[i] = a*sin(x[i]) + b x = np.linspace(0, 1, 10000) y = np.zeros_like(x) a, b = 2.0, 3.0 backend = 'cython' get_config().use_openmp = True x, y = wrap(x, y, backend=backend) e = Elementwise(axpb, backend=backend) e(x, y, a, b)
这将使用 OpenMP 和 Cython 并行执行元素操作。代码是自动生成、编译并以透明方式为您调用的。第一次运行时,编译所有内容需要一些时间,但下一次,它会被缓存并且运行得更快。
如果您只是更改backend = 'opencl' ,将使用PyOpenCL执行完全相同的代码,如果您将后端更改为'cuda',它将通过 CUDA 执行,而无需对您的代码进行任何其他更改。这显然是一个非常微不足道的例子,还有更复杂的例子可用。
例子
示例目录中提供了一些简单的示例和基准测试。