首页 > 解决方案 > Chapel-Python 集成问题

问题描述

我正在尝试查看是否可以使用 Chapel 编写用于基于 Python 的气候模型的并行代码: https ://github.com/CliMT/climt

我对 Chapel 没有任何经验,但它对我的用例来说似乎很有希望。关于如何将 Chapel 代码集成到我当前的工作流程中,我有几个问题:

  1. 我知道您可以构建可导入.so的文件,但是生成 Cython 文件时可以停止编译吗?然后我可以将它包含到发行版中并使用标准setuptools在 Travis 上编译我的项目。

  2. 我可以将numpy数组传递给用 Chapel 编写的 Python 扩展吗?

  3. 如果对 2. 的回答是肯定的,并且我的计算在数组的一维上是并行的,那么在 Chapel 中是否有一种优雅的方式来表达这种并行性?

  4. 如果我编写适用于多个节点的 Chapel 代码并将其编译为 Python 扩展,我该如何运行它?我可以使用mpirun python my_code.py某种命令吗?

标签: pythonparallel-processingchapelparallelism-amdahl

解决方案


  1. 不幸的是,目前没有。但是,我们确实将生成的 .pxd 和 .py(x) 文件保留在带有 .so 的目录中,因此您可以同时使用它们(这不是我们考虑过的功能请求,所以如果您感到有动力,绝对可以在我们的 Github 页面上打开一个问题:https ://github.com/chapel-lang/chapel/issues )。

    作为参考,我们这样做是因为 Cython 编译命令相当棘手。我以为我们打印了与 chpl 编译标志一起使用的 Cython 命令--print-commands,但事实并非如此(我会为此提出问题)。

  2. 您可以将已知原始类型的一维 numpy 数组从 Python 传递给 Chapel。我们希望尽快添加对其他 numpy 数组的支持(希望在 1.21 中,计划于 2020 年 3 月发布)

  3. 这在 Chapel 中的数组上绝对可行 - 我建议forall在遍历数组的这个维度进行计算时使用循环,这会将那个维度中的索引划分为由 Chapel 确定的多个任务。(对于那些不熟悉forall循环的人,这个链接很好地概述了这个概念)

例如:

forall x in arr.domain.dim(1) {
  // traverses the first dimension of arr's domain in parallel
  ...
}
  1. 如果您将 Chapel 库编译为具有多语言环境设置的 Python 扩展,则可以使用扩展chpl_setup函数的 numlocales 参数指定所需的语言环境(节点)的数量。这样做会在您运行 Python 程序时为您分发 Chapel 代码。

例如,您可以编写:

import MyChplLib

MyChplLib.chpl_setup(4)
...

使用 4 个语言环境(节点)运行您的程序。

我应该提一下,从 1.20 版本开始,我们不支持多语言环境库中的数组参数。我们仍在确定 1.21 版本的优先级,因此有关您希望多快的反馈将非常有帮助!


推荐阅读