numpy和全局解释器锁



我即将编写一些计算密集型Python代码,这些代码几乎肯定会把大部分时间花在numpy的线性代数函数中。

眼前的问题是令人尴尬的平行问题。长话短说,对我来说,利用这一点最简单的方法就是使用多个线程。几乎可以肯定的是,主要的障碍将是全球解释器锁(GIL)。

为了帮助设计这一点,有一个心理模型会很有用,numpy操作可以在其持续时间内释放GIL。为此,我非常感谢任何经验法则、注意事项、建议等。

如果重要的话,我在Linux上使用64位Python 2.7.1,numpy 1.5.1和scipy 0.9.0rc2是用"英特尔MKL 10.3.1"构建的。

相当多的numpy例程发布了GIL,因此它们可以在线程中高效地并行(信息)。也许你不需要做任何特别的事情!

你可以用这个问题来确定你需要的例程是否在发布GIL的例程中。简而言之,在源中搜索ALLOW_THREADSnogil

(还要注意,MKL能够为一个例程使用多个线程,因此这是获得并行性的另一种简单方法,尽管可能不是最快的方法)。

您可能会在官方wiki上找到有关NumPy和并行编程的所有问题的答案。

另外,请看一下这个配方页面——它包含了如何将NumPy与多个线程一起使用的示例代码。

令人尴尬的平行?麻木?听起来像是PyCUDA或PyOpenCL的一个很好的候选者。

最新更新