2011-10-14 29 views
5

假設我有一臺16核心機器和一個令人尷尬的並行程序。我使用了大量的numpy點積和numpy數組,如果我不使用多處理,這將是一件不容易的事情:確保numpy是針對使用多線程的blas版本構建的。但是,我正在使用多處理,並且所有內核都在努力工作。在這種情況下,使用多線程blas有什麼好處嗎?是否值得在Python中使用多線程blas實現和多處理?

大多數操作是(BLAS)1型,有些是2型

回答

2

如果您已經使用多,所有的核心都在最大負載,則會有非常少,如果有的話,好處添加將等待處理器的線程。

根據你的算法和你在做什麼,使用一種類型比另一種類型更有好處,但這非常依賴。

+0

也許我誤解了一些東西,但我的印象是一個處理器內核可以有效地使用多個線程。所以你可以在單核機器上加速。 –

+0

我不是多處理/線程方面的專家,但就我的理解而言,如果單個處理器處於最大負載狀態,則添加更多線程只會導致更多開銷在它們之間進行交換。除非有特殊的體系結構來幫助處理其他線程(例如,另一個核心?),否則不會增加性能。如果所有內核都處於最大負載,並且如果將相同的作業分成小塊,則它們仍將處於最大負載。當核心等待發生某些事情時,向單個核心機器添加線程很有用。 – TorelTwiddler

6

對於您的代碼實際上使用多線程BLAS調用的假設,您可能需要小心謹慎。 numpy運算符相對較少實際使用底層BLAS,而相對較少的BLAS調用實際上是多線程的。 numpy.dot使用BLAS dot,gemvgemm,具體取決於操作,但在那些操作中,只有gemm通常是多線程的,因爲O(N)和O(N^2)BLAS調用幾乎沒有任何性能優勢。 。如果您將自己限制爲1級和2級BLAS操作,那麼即使您正在使用由mulithreaded BLAS構建的numpy實現(如Atlas或MKL),我懷疑實際上是否正在使用任何多線程BLAS調用。

+0

我有興趣解釋這種行爲的來源,如果你知道關於它的一些互聯網文檔... – Simon

+0

明顯的來源是numpy代碼本身。除此之外,Clint Whaley(以前來自UTK的Atlas的作者)和Kazotoge Goto(以前來自TACC的GotoBLAS的作者)已經撰寫並發表了許多關於BLAS實現及其性能的設計文檔和學術論文。 – avidday