2011-08-04 47 views
4

我試圖弄清楚SciPy/NumPy中的哪些函數在多個處理器上運行。我可以例如閱讀SciPy參考手冊中的SciPy使用這個,但我更關心哪些函數執行並行計算,因爲並不是所有的函數都可以。當然,如果在你輸入help(SciPy.foo)時包含了這個夢想場景,但這似乎並不是這樣。是否有可能知道哪些SciPy/NumPy函數在多個核心上運行?

任何幫助將不勝感激。

最佳,

馬蒂亞斯

+2

這有點棘手,因爲它在某種程度上取決於BLAS/LAPACK庫,而不是'numpy' /'scipy'。例如,MKL(http://software.intel.com/en-us/articles/intel-mkl/)可能會使用多個內核,而其他庫可能不會。 – NPE

+0

是否有某種您想到的功能? – NPE

+0

@aix我一般都在思考SciPy,但也許更關注線性代數函數。我看到例如scipy.linalg.solve使用多個內核(通過檢查我的系統監視器來查看內核的活動)。 – matiasq

回答

4

我認爲這個問題是您使用,而不是SciPy的/ NumPy的BLAS的/ LAPACK庫,更好地解決。

某些BLAS/LAPACK庫,如MKL,在其他實現可能不會使用的情況下,本地使用多個內核。

採取scipy.linalg.solve爲例,這裏是它的源代碼(爲了清楚省略了一些錯誤處理代碼):

def solve(a, b, sym_pos=0, lower=0, overwrite_a=0, overwrite_b=0, 
      debug = 0): 
    if sym_pos: 
     posv, = get_lapack_funcs(('posv',),(a1,b1)) 
     c,x,info = posv(a1,b1, 
         lower = lower, 
         overwrite_a=overwrite_a, 
         overwrite_b=overwrite_b) 
    else: 
     gesv, = get_lapack_funcs(('gesv',),(a1,b1)) 
     lu,piv,x,info = gesv(a1,b1, 
          overwrite_a=overwrite_a, 
          overwrite_b=overwrite_b) 

    if info==0: 
     return x 
    if info>0: 
     raise LinAlgError, "singular matrix" 
    raise ValueError,\ 
      'illegal value in %-th argument of internal gesv|posv'%(-info) 

正如你所看到的,它只是周圍的LAPACK函數的兩個家庭的簡單封裝(以DPOSVDGESV爲例)。

在SciPy級別上沒有並行性,但您可以觀察到在系統上使用多個內核的功能。唯一可能的解釋是你的LAPACK庫能夠使用多核,沒有NumPy/SciPy做任何事情都可以使用多核,

+0

感謝您的有用答案。我有Enthoughts 2.7.1使用MKL的python,所以我狀態良好。 – matiasq

+0

以及如何找出哪些BLAS/LAPACK函數並行運行? – usethedeathstar

相關問題