我运行的是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
我刚刚试过:'python -mtimeit -s'import numpy as np; a = np.random.randn(1e3,1e3)''np.dot(a,a)''它使用多个核心。所以至少在某些配置中它可以做到这一点。 – jfs 2012-08-03 05:28:34
@ J.F.Sebastian我知道它可以,但我试图找出我失踪的东西。 – Nino 2012-08-03 19:23:44
@ J.F.Sebastian我只是试着做你所做的事情,并充分利用我的核心。原因是numpy计算放弃了GIL,因此以for循环的形式运行多个不同的计算(如timeit所做的),每个计算都在不同的线程中完成。然而,我遇到的问题是一个计算本身的多线程。如果我只是在不使用timeit的情况下运行类似于您的脚本(因此不需要迭代),则一次只能使用一个内核。 – Nino 2012-08-07 00:33:47