我希望使用Python作为前端,Fortran作为后端。我还想让Fortran部分并行化-最佳策略是什么?

5
我有一个Python脚本,希望能实现以下功能:
  1. 将一些粒子位置调用到一个数组中
  2. 在所有512^3个位置上运行算法,将它们分配到一个NxNxN矩阵中
  3. 将该矩阵反馈回Python
  4. 使用Python绘图来可视化矩阵(例如mayavi)
首先,我必须以串行方式编写它,但理想情况下,我希望并行化步骤2以加快计算速度。有什么工具/策略可以让我开始?我很了解Python和Fortran,但对于如何为我的特定问题连接这两个不太了解。目前我正在用Fortran做所有事情,然后加载我的Python程序 - 我想一次性完成所有操作。我听说过py2f,但在我深入研究之前,我希望得到有经验的人的意见。谢谢!
编辑:我想并行化的东西是'尴尬的并行',因为它只是一个由N个粒子组成的循环,我希望尽快通过这个循环。
3个回答

5
您有两个基本的绑定选项。第一种是使用 f2py,另一种是在您的Fortran中使用C互操作性并使用Cython进行绑定。关于f2py的教程在这里。它并不难,只需为f2py指令添加到您的Fortran代码中即可,但通常它们是不需要的。
对于并行化,如果单台机器上的并行化已经足够,那么第一种方法可能要使用OpenMP。它使用线程,并且对于具有尴尬并行性的循环非常容易使用。只需确保不要在线程中写入任何全局变量,如果有,请使用同步指令。

我个人很喜欢f2py--就单机并行而言,使用Python的multiprocessing再容易不过了。由于每个进程都是独立运行的,你不需要担心线程安全问题。 - mgilson
这就是我喜欢共数组的原因(MPI也不错,但不太直观)。我实际上只使用Python进行后处理,我发现在计算代码方面,我并没有比Fortran更高效。部分原因是需要经常在NumPy和Fortran数组索引约定之间切换。在这方面,我认为与Chapel相比,使用Python是一种退步。 - Vladimir F Героям слава
如果我有numpy,那么我就有f2py吗?我正在尝试这些示例,但是我遇到了编译错误。 - Griff
嗯,我不知道你使用的是哪个平台和Python发行版。在Linux上很可能是可以的,只需检查一下你的软件包管理器。至于Windows,老实说,我不清楚。 - Vladimir F Героям слава
@VladimirF 你知道一个非常简单的Cython选项教程吗?我对f2py失去了兴趣... - bdforbes

2
一种替代 VladimirF 建议的方法是将两个部分设置为客户端-服务器结构,您的 Python 部分可以使用套接字与 Fortran 部分通信。尽管这需要实现一些交互协议的负担,但它有一个优点,即您可以获得干净的分离,甚至可以在不同的机器上运行它们并通过网络进行交互。
实际上,使用这种方法,您甚至可以执行令人尴尬的并行部分,通过生成尽可能多的 Fortran 应用程序实例,并将它们全部用不同的数据进行处理。

1

这是一条与 @haraldkl 相同方向的回答,更像是一个解答。我目前正在使用 sockets 来在 Fortran 和 Python 之间发送数据,可以在 repo 中找到最小化的工作示例。

由于 Fortran 没有内置的支持 sockets 的库,所以使用 C 库的包装器会有些棘手。不过,它仍然运行良好。

我的想法是将这种策略纳入我已有的更大规模的并行 Fortran 代码中,虽然我还没有弄清楚这部分内容。可能在 Python 中对 sockets 进行线程处理,使用多个端口可能会起作用。


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