2012-08-03 71 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