5

我有一个 python 脚本,我希望大致做到这一点:

  1. 将一些粒子位置调用到数组中

  2. 对所有 512^3 个位置运行算法以将它们分配到 NxNxN 矩阵

  3. 将该矩阵反馈给python

  4. 在 python 中使用绘图来可视化矩阵(即 mayavi)

首先我必须以串行方式编写它,但理想情况下我想并行化第 2 步以加快计算速度。什么工具/策略可以让我开始。我对 Python 和 Fortran 了如指掌,但对于如何针对我的特定问题将两者联系起来却知之甚少。目前我在 Fortran 中做所有事情,然后加载我的 python 程序 - 我想一次完成所有事情。我听说过 py2f,但我想在我进入一个特定的兔子洞之前获得有经验的人的意见。谢谢

编辑:我想要并行的东西是“令人尴尬的并行”,因为这只是 N 个粒子的循环,我想尽快通过该循环。

4

3 回答 3

5

您有两个基本的绑定选项。第一个使用f2py,另一个在你的 Fortran 中使用与 C 的互操作性并使用 .bind 进行绑定Cython。教程f2py这里。这一点都不难,有一些 f2py 指令可以放置到您的 Fortran 代码中,但通常不需要它们。

对于并行化,第一种使用的方法可能是 OpenMP,如果单台机器上的并行化对您来说就足够了。它使用线程并且易于使用具有令人尴尬的并行性的循环。只要确保您没有写入线程中的任何全局变量,如果是,请为此使用同步指令。

于 2012-12-13T08:33:07.523 回答
2

VladimirF 建议的另一种方法是将这两个部分设置为客户端服务器构造,您的 Python 部分可以使用套接字与 Fortran 部分通信。尽管这带来了为交互实现一些协议的负担,但它有一个优势,即您可以获得清晰的分离,甚至可以通过网络交互在不同的机器上继续运行它们。

事实上,使用这种方法,您甚至可以通过根据需要生成尽可能多的 Fortran 应用程序实例并为它们提供不同的数据来完成令人尴尬的并行部分。

于 2012-12-13T11:01:17.860 回答
1

比@haraldkl 相同方向的评论更多的答案 - 我目前正在使用套接字将数据从 Fortran 发送到 Ptyhon,反之亦然。在这个repo中可以找到一个最小的工作示例。Fortran 中的套接字有点棘手,因为没有支持它们的内置库,您需要使用 C 库的包装器。不过,效果很好。

我的想法是将这个策略合并到一个更大的并行 Fortran 代码中,即使我还没有弄清楚那部分。可能在 Python 中线程化套接字并使用多个端口可以工作。

于 2019-04-05T03:23:19.283 回答