假設我有一臺16核心機器和一個令人尷尬的並行程序。我使用了大量的numpy點積和numpy數組,如果我不使用多處理,這將是一件不容易的事情:確保numpy是針對使用多線程的blas版本構建的。但是,我正在使用多處理,並且所有內核都在努力工作。在這種情況下,使用多線程blas有什麼好處嗎?是否值得在Python中使用多線程blas實現和多處理?
大多數操作是(BLAS)1型,有些是2型
假設我有一臺16核心機器和一個令人尷尬的並行程序。我使用了大量的numpy點積和numpy數組,如果我不使用多處理,這將是一件不容易的事情:確保numpy是針對使用多線程的blas版本構建的。但是,我正在使用多處理,並且所有內核都在努力工作。在這種情況下,使用多線程blas有什麼好處嗎?是否值得在Python中使用多線程blas實現和多處理?
大多數操作是(BLAS)1型,有些是2型
如果您已經使用多,所有的核心都在最大負載,則會有非常少,如果有的話,好處添加將等待處理器的線程。
根據你的算法和你在做什麼,使用一種類型比另一種類型更有好處,但這非常依賴。
對於您的代碼實際上使用多線程BLAS調用的假設,您可能需要小心謹慎。 numpy運算符相對較少實際使用底層BLAS,而相對較少的BLAS調用實際上是多線程的。 numpy.dot
使用BLAS dot
,gemv
或gemm
,具體取決於操作,但在那些操作中,只有gemm
通常是多線程的,因爲O(N)和O(N^2)BLAS調用幾乎沒有任何性能優勢。 。如果您將自己限制爲1級和2級BLAS操作,那麼即使您正在使用由mulithreaded BLAS構建的numpy實現(如Atlas或MKL),我懷疑實際上是否正在使用任何多線程BLAS調用。
也許我誤解了一些東西,但我的印象是一個處理器內核可以有效地使用多個線程。所以你可以在單核機器上加速。 –
我不是多處理/線程方面的專家,但就我的理解而言,如果單個處理器處於最大負載狀態,則添加更多線程只會導致更多開銷在它們之間進行交換。除非有特殊的體系結構來幫助處理其他線程(例如,另一個核心?),否則不會增加性能。如果所有內核都處於最大負載,並且如果將相同的作業分成小塊,則它們仍將處於最大負載。當核心等待發生某些事情時,向單個核心機器添加線程很有用。 – TorelTwiddler