2012-08-03 56 views
7

我運行的是Mac OS X 10.6.8,並且使用Enthought Python Distribution。我想讓numpy功能利用我的兩個核心。我有一個類似於這個職位的問題:multithreaded blas in python/numpy但通過該海報的步驟後,我仍然有同樣的問題。這裏是我的numpy.show_config():假設自動線程scipy和numpy函數不使用多個核心

lapack_opt_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
blas_opt_info: 
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
lapack_mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
blas_mkl_info: 
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
mkl_info: 
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 

正如原文章的評論,我刪除了設置的變量MKL_NUM_THREADS=1行。但即使如此,應該利用多線程的numpy和scipy函數也只能使用我的一個內核。還有什麼我應該改變?

編輯:爲了澄清,我試圖讓單個計算例如numpy.dot()根據MKL實現自行使用多線程,我不想利用numpy計算釋放GIL控制權,從而使其他函數的多線程更容易。

這裏是一個小的腳本,應利用多線程,但沒有我的機器上:

import numpy as np 

a = np.random.randn(1000, 10000) 
b = np.random.randn(10000, 1000) 

np.dot(a, b) #this line should be multi-threaded 
+0

我剛剛試過:'python -mtimeit -s'import numpy as np; a = np.random.randn(1e3,1e3)''np.dot(a,a)''它使用多個核心。所以至少在某些配置中它可以做到這一點。 – jfs 2012-08-03 05:28:34

+0

@ J.F.Sebastian我知道它可以,但我試圖找出我失蹤的東西。 – Nino 2012-08-03 19:23:44

+0

@ J.F.Sebastian我只是試着做你所做的事情,並充分利用我的核心。原因是numpy計算放棄了GIL,因此以for循環的形式運行多個不同的計算(如timeit所做的),每個計算都在不同的線程中完成。然而,我遇到的問題是一個計算本身的多線程。如果我只是在不使用timeit的情況下運行類似於您的腳本(因此不需要迭代),則一次只能使用一個內核。 – Nino 2012-08-07 00:33:47

回答

7

This article似乎暗示numpy的智能化使得並行某些操作,根據操作的預測增速:

  • 「如果你numpy的/ SciPy的是使用其中之一編譯,然後點()將並行計算(如果這是更快),無需你做任何事情。」

根據numpy的啓發式來確定何時並行化一個特定的dot()調用,也許你的小測試用例不會顯示出明顯的加速?也許嘗試一個可笑的大操作,看看兩個核心是否被利用?

請注意,您的處理器/機器配置實際上是否支持BLAS?

+0

它確實支持BLAS,但這是不可能的,因爲我的numpy鏈接到MKL。所以,奇怪的是,出於挫折,我試着再次運行該腳本,現在它可以工作。非常令人困惑...但現在我很好走,而且自從你回答以來,50分給你。謝謝。 – Nino 2012-08-07 20:49:11

+0

嘖嘖,謝謝! – chisaipete 2012-08-07 21:18:26