2014-04-22 117 views
1

我目前正在使用Python中的minmax樹ai。爲了從ai中擠出額外的性能,我一直在使用cython來優化瓶頸,並試圖對樹木進行多處理。使用cython進行緩慢多處理

我遇到的問題是,使用cython進行多處理時,ai確實比較慢。我知道有多處理的開銷,有時會導致它變慢。但是,使用cython時只會變慢。當使用等效的Python代碼時,多處理提供了2-3倍的性能提升。

我已經運行了幾個測試來排除任何明顯的問題。例如,我運行了啓用和不啓用alpha-beta修剪的測試(在沒有多處理的情況下,這可能會在某些情況下執行得更好),但它沒有區別。我已經將cython對象設置爲pickleable,並且多處理的cython ai構建了一個適當的樹。我正在使用的多處理實現(僅將根子項傳遞給pool.map函數)只會在使用純Python代碼時提高性能。

有沒有一些古怪的cython,我失蹤了?通過多處理使用cython代碼(或一般的c擴展)會帶來額外的開銷嗎?或者這是cython本身的問題?

編輯:下面是一些示例定時:

鑑於7的深度,並且沒有α-β修剪:(所有時間以秒計)

用Cython,無多處理:
12.457

用Cython,多重:
15.440

沒有用Cython,沒有多重:
26.010

沒有用Cython,多重:
17.609

多的測試之後,我已經找到了開銷的原因。 @Veedrac是正確的,因爲使用c擴展會帶來額外的開銷,而python的緩慢掩蓋了沒有cython的開銷。具體而言,從多個處理器返回分支並將其添加到根節點時發生開銷。這解釋了爲什麼開銷不是恆定的,並且隨着樹的深度增加而實際擴大。

我實際上已經懷疑過這一點,並且在此之前進行了測試。然而,看起來我之前用來測試這個開銷的代碼是被竊聽的。我現在已經修復了多處理,只返回了必要的信息,並且開銷已經被消除了。具有多處理功能的Cython現在運行速度非常快。

+0

你看過[Cython分析](http://docs.cython.org/src/tutorial/profiling_tutorial.html)嗎? – Schollii

+0

@Schollii我試着分析多處理代碼,但它似乎不能很好地處理多處理。它只顯示佔用所有程序時間的thread.lock。 – PaintingInAir

+0

@PaintingInAir看看[在這個答案](http://stackoverflow.com/a/22839233/832621),展示瞭如何在Cython的prange()中包裝openMP,使用'nogil'函數 –

回答

1

如果您在C和Python類型之間過多,Cython可能會產生翻譯成本,這可能會有所貢獻。還有一個事實是Python的加速比將會更高,其中隱藏了的開銷。

一個建議是使用nogil函數,看看threading是否具有較低的開銷。

+0

不幸的是,第一部分嘗試多線程大量使用python對象,如果沒有gil就不能訪問或修改它。 – PaintingInAir

+0

什麼樣的Python對象? – Veedrac