Chapel-Python 整合问题
Chapel-Python integration questions
我正在尝试查看是否可以使用 Chapel 编写并行代码以用于基于 Python 的气候模型:
https://github.com/CliMT/climt
我对 Chapel 没有任何经验,但它对我的用例来说似乎很有前途。关于如何将 Chapel 代码集成到我当前的工作流程中,我有几个问题:
我知道你可以构建可导入的.so
文件,但是生成Cython文件时编译会停止吗?然后我可以将它包含到发行版中并使用标准 setuptools
在 Travis 上编译我的项目。
我可以将 numpy
数组传递给用 Chapel 编写的 Python 扩展吗?
如果对 2. 的回答是肯定的,并且我的计算在数组的一维上是令人尴尬的并行,那么在 Chapel 中是否有一种优雅的方式来表达这种并行性?
如果我编写可在多个节点上运行的 Chapel 代码并将其编译为 Python 扩展,我该如何 运行 它?我可以使用 mpirun python my_code.py
之类的命令吗?
很遗憾,目前没有。但是,我们确实将生成的 .pxd 和 .py(x) 文件保留在带有 .so 的目录中,因此您可以同时使用它们(这不是我们考虑过的功能请求,所以如果您感到有动力,绝对可以在我们的 Github 页面上随意打开一个问题:https://github.com/chapel-lang/chapel/issues)。
作为参考,我们这样做是因为 Cython 编译命令相当棘手。我以为我们打印了与 chpl 编译标志一起使用的 Cython 命令 --print-commands
,但事实并非如此(我会为此提出问题)。
您可以将已知原始类型的一维 numpy 数组从 Python 传递给 Chapel。我们希望尽快添加对其他 numpy 数组的支持(希望在 1.21 中,计划于 2020 年 3 月发布)
这在 Chapel 中的数组上绝对可行 - 我建议在遍历数组的这个维度进行计算时使用 forall
循环,它将那个维度中的索引划分为Chapel 确定的一些任务。 (对于那些不熟悉 forall
循环的人,this link 很好地概述了这个概念)
例如:
forall x in arr.domain.dim(1) {
// traverses the first dimension of arr's domain in parallel
...
}
- 如果您将 Chapel 库编译成具有多语言环境设置的 Python 扩展,您可以使用扩展的
chpl_setup
函数的 numlocales 参数指定所需的语言环境(节点)数量。当您 运行 您的 Python 程序时,这样做会负责为您分发 Chapel 代码。
例如,您可以这样写:
import MyChplLib
MyChplLib.chpl_setup(4)
...
到 运行 具有 4 个语言环境(节点)的程序。
我应该提一下,从 1.20 版开始,我们不支持多语言环境库中的数组参数。我们仍在确定 1.21 版本的优先级,所以关于您想要多快的反馈将非常有帮助!
我正在尝试查看是否可以使用 Chapel 编写并行代码以用于基于 Python 的气候模型: https://github.com/CliMT/climt
我对 Chapel 没有任何经验,但它对我的用例来说似乎很有前途。关于如何将 Chapel 代码集成到我当前的工作流程中,我有几个问题:
我知道你可以构建可导入的
.so
文件,但是生成Cython文件时编译会停止吗?然后我可以将它包含到发行版中并使用标准setuptools
在 Travis 上编译我的项目。我可以将
numpy
数组传递给用 Chapel 编写的 Python 扩展吗?如果对 2. 的回答是肯定的,并且我的计算在数组的一维上是令人尴尬的并行,那么在 Chapel 中是否有一种优雅的方式来表达这种并行性?
如果我编写可在多个节点上运行的 Chapel 代码并将其编译为 Python 扩展,我该如何 运行 它?我可以使用
mpirun python my_code.py
之类的命令吗?
很遗憾,目前没有。但是,我们确实将生成的 .pxd 和 .py(x) 文件保留在带有 .so 的目录中,因此您可以同时使用它们(这不是我们考虑过的功能请求,所以如果您感到有动力,绝对可以在我们的 Github 页面上随意打开一个问题:https://github.com/chapel-lang/chapel/issues)。
作为参考,我们这样做是因为 Cython 编译命令相当棘手。我以为我们打印了与 chpl 编译标志一起使用的 Cython 命令
--print-commands
,但事实并非如此(我会为此提出问题)。您可以将已知原始类型的一维 numpy 数组从 Python 传递给 Chapel。我们希望尽快添加对其他 numpy 数组的支持(希望在 1.21 中,计划于 2020 年 3 月发布)
这在 Chapel 中的数组上绝对可行 - 我建议在遍历数组的这个维度进行计算时使用
forall
循环,它将那个维度中的索引划分为Chapel 确定的一些任务。 (对于那些不熟悉forall
循环的人,this link 很好地概述了这个概念)
例如:
forall x in arr.domain.dim(1) {
// traverses the first dimension of arr's domain in parallel
...
}
- 如果您将 Chapel 库编译成具有多语言环境设置的 Python 扩展,您可以使用扩展的
chpl_setup
函数的 numlocales 参数指定所需的语言环境(节点)数量。当您 运行 您的 Python 程序时,这样做会负责为您分发 Chapel 代码。
例如,您可以这样写:
import MyChplLib
MyChplLib.chpl_setup(4)
...
到 运行 具有 4 个语言环境(节点)的程序。
我应该提一下,从 1.20 版开始,我们不支持多语言环境库中的数组参数。我们仍在确定 1.21 版本的优先级,所以关于您想要多快的反馈将非常有帮助!