2011-06-01 73 views
19

我即將編寫一些計算密集型Python代碼,它幾乎肯定會將大部分時間用在numpy的線性代數函數中。numpy和全局解釋器鎖

手頭的問題是embarrassingly parallel。長話短說,對我來說,最簡單的方法就是使用多線程。主要障礙幾乎肯定會是全球口譯員鎖定(GIL)。

爲了幫助設計,有一個精神模型是有用的,其中numpy操作可以期望在其持續時間釋放GIL。爲此,我會很感激任何經驗法則,做什麼和不該做什麼,指針等。

萬一它很重要,我在Linux上使用64位Python 2.7.1,與numpy 1.5.1和scipy 0.9.0rc2,使用英特爾MKL 10.3.1構建。

+0

你有沒有考慮過使用['multiprocessing'](http://docs.python.org/library/multiprocessing.html)lib而不是線程?你不必再爲GIL煩惱了。 – Jeannot 2011-06-01 11:45:13

+0

@Jeannot:我有,謝謝。由於問題的性質,線程是我的第一選擇。如果我無法做到這一點,我會考慮替代方案。 – NPE 2011-06-01 11:51:04

回答

8

您可能會在the official wiki上找到關於NumPy和並行編程的所有問題的答案。

此外,看看this recipe page - 它包含如何使用NumPy與多個線程的示例代碼。

+4

我看了一下wiki頁面,並且絕對沒有關於哪些numpy函數做的信息,並且不釋放GIL。 – DanielSank 2014-06-04 01:46:52

3

尷尬平行? NumPy的?聽起來像是PyCUDAPyOpenCL的好候選人。

+1

聽起來不像這是一個很好的GPU問題,因爲每個線程都會做線性代數。雖然有GPU線性代數包。我的一位朋友最近使用ACML-GPU版本的LAPACK編輯了scipy。 – kiyo 2011-06-02 15:54:58

+0

Theano可能是與numpy相關的應用程序的更好選擇。 – 2015-12-20 03:58:35

1

相當一些numpy例程釋放GIL,因此它們可以高效地在線程中並行(info)。也許你不需要做任何特別的事情!

您可以使用this question來查找您需要的例程是否是釋放GIL的例程。總之,在源中搜索ALLOW_THREADS或。 (也請注意,MKL有能力爲例程使用多個線程,所以這是獲得並行性的另一種簡單方法,儘管可能不是最快的類型)。