我有一个python脚本,我希望大致这样做:
首先我必须连续编写它,但理想情况下我想并行化第2步以加速计算。什么工具/策略可能会让我开始。我知道Python和Fortran很好但不太关于如何将这两个连接到我的特定问题。目前我正在Fortran中完成所有工作,然后加载我的python程序 - 我想立刻完成所有工作。我听说过py2f,但是在我走下一个特定的兔子洞之前,我希望得到经验丰富的人的意见。谢谢
编辑:我想要平行的东西是“令人尴尬的平行”,因为它只是一个N粒子循环,我想尽快通过这个循环。
您有两个基本的绑定选项。首先使用f2py
,另一个使用Fortran中的C互操作性并使用Cython
进行绑定。 f2py
的教程是here。这并不困难,有一些指令可以将f2py放到你的Fortran代码中,但通常不需要它们。
对于并行化,第一种使用方法可能是OpenMP,如果在一台机器上进行并行化就足够了。它使用线程,易于用于具有令人尴尬的并行性的循环。只要确保你不写入线程中的任何全局变量,如果是,请使用同步指令。
VladimirF建议的另一种方法可能是将这两个部分设置为客户端服务器构造,其中Python部分可以使用套接字与Fortran部分进行通信。虽然这会带来实现某些交互协议的负担,但它的优势在于,您可以获得干净的分离,甚至可以通过网络上的交互在不同的计算机上运行它们。
事实上,通过这种方法,您甚至可以通过根据需要生成尽可能多的Fortran应用程序实例并使用不同的数据提供所有实例来完成令人尴尬的并行部分。
更多答案而不是与@haraldkl在同一方向上的评论 - 我目前正在使用套接字将数据从Fortran发送到Ptyhon而反之亦然。在这个repo中可以找到一个最小的工作示例。 Fortran中的套接字有点棘手,因为没有内置库支持它们,您需要在C库周围使用包装器。仍然,工作得很好。
我的想法是将这个策略合并到一个更大的并行Fortran代码中,即使我还没有弄清楚那个部分。可能在Python中使用多个端口线程化套接字可能会起作用。