教堂语言(Chapel)与Python的整合问题

7

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

虽然我没有使用过Chapel,但它似乎非常适合我的用例。我有几个关于如何将Chapel代码集成到当前工作流程中的问题:

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

  2. 我是否可以将numpy数组传递给使用Chapel编写的Python扩展程序?

  3. 如果第2个问题的答案是肯定的,并且我的计算在数组的一个维度上具有尴尬的并行性,那么有没有一种优雅的方式来表达这种在Chapel中的并行性?

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

1个回答

7

很遗憾,目前不支持。但是,我们会在.so目录中留下生成的.pxd和.py(x)文件,因此在此期间您可以利用这些文件(这不是我们考虑过的功能请求,如果您感到有动力,请随时在我们的Github页面上打开一个问题:https://github.com/chapel-lang/chapel/issues)。为了参考,我们这样做是因为Cython编译命令相当棘手。我曾经以为我们会使用chpl编译标志--print-commands打印出使用的Cython命令,但事实并非如此(我将为此提出一个问题)。
您可以从Python向Chapel传递已知原始类型的一维numpy数组。我们希望尽快添加对其他numpy数组的支持(计划于2020年3月发布1.21版)。
这在Chapel中的数组上绝对可行-我建议在遍历该数组的维度进行计算时使用forall循环,它将把该维度的索引分成由Chapel确定的任务数量。(对于那些不熟悉forall循环的人,this link提供了该概念的良好概述)

例如:

forall x in arr.domain.dim(1) {
  // traverses the first dimension of arr's domain in parallel
  ...
}
  1. 如果您使用多语言环境设置将Chapel库编译为Python扩展程序,您可以使用numlocales参数指定所需的语言环境(节点)数量,并在扩展程序的chpl_setup函数中完成Chapel代码的分发工作,从而使您运行Python程序时更加便捷。

例如,您可以编写以下代码:

import MyChplLib

MyChplLib.chpl_setup(4)
...

使用4个区域设置(节点)运行您的程序。

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


谢谢,Lydia。我会在 GitHub 上提出问题。 - Joy Monteiro
1
补充一下Lydia的评论:如果这里的功能改进会极大地提高您使用Chapel的能力,请告诉我们。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接