共享内存并行编程的Python指南


11

我有为共享内存机器(在C和FORTRAN中)编码OpenMP的经验,可以执行简单的任务,例如矩阵加法,乘法等(仅看它如何与LAPACK竞争)。我知道OpenMP足以执行简单的任务,而无需查看文档。

最近,我转到我的项目中使用Python,除了绝对的基础知识之外,我没有Python方面的经验。

我有两个问题:

  • 有没有很好的指南(在线PDF)来描述Python的共享内存并行计算?

  • 实现它的最佳方法是什么?我看过一点,ctypes我不确定这是否是最好的方法。(最好的意思是,在程序员时间和系统时间之间要有一个很好的权衡。编码也不应该太繁琐,执行速度也不应该太慢)

Answers:


8

[这是我的第一篇文章,我希望我不会完全误解SE的用法-如果是的话,我事先表示歉意。

我同意“ bgschaid”的观点,根据所提供的信息很难回答这个问题。如果您希望低级例程利用多核体系结构,或者需要为难堪的并行问题(或介于两者之间)使用并行机制,则将产生巨大的差异。可以在这里找到Python中不同并行计算可能性的概述。

在前一种情况下,我肯定建议使用诸如NumPy / SciPy之类的工具,至少在Enthought的MKL编译版本中,该工具支持多核体系结构。在这里,您可以通过环境变量“ MKL_NUM_THREADS”控制要使用的内核数。这依赖于高度优化的库,我们很难期望它能击败性能。我相信通常建议尽可能使用这些高质量和高度优化的库。

如果您希望在较粗的层次上利用并行性,则Python标准工具多处理易于使用-并且还支持共享数据对象。有多种工具可以用作多处理程序包的一部分。我已经将map_async(类似于SIMD)和apply_async(类似于MIMD)用于具有良好结果的几个问题。在多处理包是很容易使用并且是Python的方式,你可以期待你的代码的其他潜在用户能够轻松地使用它的标准部件。 多重处理还直接链接到NumPy数据对象。使用多重处理时我建议您将环境变量“ MKL_NUM_THREADS”设置为1,以便每个进程/工作人员仅允许NumPy使用一个核心-否则,您可能最终会在NumPy并行与多处理之间陷入资源争夺,从而导致性能下降。 在同一操作系统下,多处理对于多CPU /多核体系结构的工作效果很好。我在具有4个Xeon E7-4850 CPU(每个10核)和512 GB内存的共享内存计算机上使用了多处理功能,它的运行效果非常好。共享数组可以由multiprocessing.Arraysharedctypes处理。您可以在此处找到Python文档-检查library.pdf文件。我有一些幻灯片解释了其中的一些基本部分-如果需要,请告诉我。

如果您具有带有分布式内存的群集配置,我相信mpi4py可能是首选工具。我自己并没有使用过它,但是我知道它在Python并行编程中已被大量使用。


3

这取决于您尝试并行编程的级别。例如,对于矩阵/向量而言,使用python的第一站将是NumPy / SciPy(它们提供了数字库的接口,可在Python的便利下为您提供库的全速运行),从他们对并行性的描述看来,如果将库编译为可并行使用,则程序将利用多核进行某些操作。(似乎本文有点老,在此同时,情况可能有所改善。此外,还有其他并行编程方法的链接。

当然,还有mpi4py可以直接对MPI进行编程(包含在以上文章中)

我的底线是:如果您的主要兴趣是向量/矩阵运算,而并行性是您“唯一”需要快速完成的工作,那么您应该看看NumPy / SciPy生态系统,并且仅当找不到如果您要编写自己的库,则需要那里的东西

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.