Jin*_*ing 9 python multithreading numpy blas intel-mkl
我正在使用numpy,我的模型涉及密集矩阵矩阵乘法.为了加快速度,我使用OpenBLAS多线程库来并行化numpy.dot函数.
我的设置如下,
$ OMP_NUM_THREADS=8 python test_mul.py
代码,我从https://gist.github.com/osdf/获取
test_mul.py :
import numpy
import sys
import timeit
try:
import numpy.core._dotblas
print 'FAST BLAS'
except ImportError:
print 'slow blas'
print "version:", numpy.__version__
print "maxint:", sys.maxint
print
x = numpy.random.random((1000,1000))
setup = "import numpy; x = numpy.random.random((1000,1000))"
count = 5
t = timeit.Timer("numpy.dot(x, x.T)", setup=setup)
print "dot:", t.timeit(count)/count, "sec"
Run Code Online (Sandbox Code Playgroud)
当我使用OMP_NUM_THREADS = 1 python test_mul.py时,结果是
dot: 0.200172233582 sec
Run Code Online (Sandbox Code Playgroud)
OMP_NUM_THREADS = 2
dot: 0.103047609329 sec
Run Code Online (Sandbox Code Playgroud)
OMP_NUM_THREADS = 4
dot: 0.0533880233765 sec
Run Code Online (Sandbox Code Playgroud)
事情进展顺利.
但是,当我设置OMP_NUM_THREADS=8....代码开始"偶尔工作".
有时它有效,有时甚至不运行,并给我核心转储.
时OMP_NUM_THREADS > 10.代码似乎总是打破..我想知道这里发生了什么?是否有类似MAXIMUM数字线程的东西,每个进程可以使用?鉴于我的机器中有12个CPU,我可以提高这个限制吗?
谢谢
首先,我真的不明白你的意思是'OpenBLAS + IntelMKL'.这两个都是BLAS库,numpy应该只在运行时链接到其中一个.您应该检查这两个numpy中的哪一个实际上正在使用.你可以通过调用:
$ ldd <path-to-site-packages>/numpy/core/_dotblas.so
Run Code Online (Sandbox Code Playgroud)
更新: numpy/core/_dotblas.so在numpy v1.10中删除了,但你可以检查链接numpy/core/multiarray.so.
例如,我链接到OpenBLAS:
...
libopenblas.so.0 => /opt/OpenBLAS/lib/libopenblas.so.0 (0x00007f788c934000)
...
Run Code Online (Sandbox Code Playgroud)
如果您确实链接到OpenBLAS,是否从源代码构建它?如果你这样做,你应该看到Makefile.rule有一个注释选项:
...
# You can define maximum number of threads. Basically it should be
# less than actual number of cores. If you don't specify one, it's
# automatically detected by the the script.
# NUM_THREADS = 24
...
Run Code Online (Sandbox Code Playgroud)
默认情况下,OpenBLAS将尝试自动设置要使用的最大线程数,但如果没有正确检测到此行,您可以尝试自行取消注释和编辑此行.
另外,请记住,使用更多线程时,您可能会看到性能方面的收益递减.除非您的阵列非常大,否则使用6个以上的线程不太可能提高性能,因为线程创建和管理所涉及的开销增加了.
| 归档时间: |
|
| 查看次数: |
9623 次 |
| 最近记录: |