【发布时间】:2014-06-13 09:11:54
【问题描述】:
我尝试评估链接到 ATLAS 的 numpy 与链接到 OpenBLAS 的 numpy 的性能。对于 ATLAS,我得到了一些奇怪的结果,如下所述。
用于评估矩阵-矩阵乘法(又名 sgemm)的 Python 代码如下所示:
import sys
sys.path.insert(0, "numpy-1.8.1")
import numpy
import timeit
for i in range(100, 501, 100):
setup = "import numpy; m1 = numpy.random.rand(%d, %d).astype(numpy.float32)" % (i, i)
timer = timeit.Timer("numpy.dot(m1, m1)", setup)
times = timer.repeat(100, 1)
print "%3d" % i,
print "%7.4f" % numpy.mean(times),
print "%7.4f" % numpy.min(times),
print "%7.4f" % numpy.max(times)
如果我使用链接到 ATLAS 的 numpy 运行此脚本,我会在测量的时间中得到很大的变化。您会在第一列中看到矩阵大小,然后是通过运行矩阵矩阵乘法 100 倍获得的执行时间的平均值、最小值和最大值:
100 0.0003 0.0003 0.0004
200 0.0023 0.0010 0.0073
300 0.0052 0.0026 0.0178
400 0.0148 0.0066 0.0283
500 0.0295 0.0169 0.0531
如果我使用一个线程使用链接到 OpenBLAS 的 numpy 重复此过程,则运行时间会更加稳定:
100 0.0002 0.0002 0.0003
200 0.0014 0.0014 0.0015
300 0.0044 0.0044 0.0047
400 0.0102 0.0101 0.0105
500 0.0169 0.0168 0.0177
谁能解释这个观察结果?
编辑:附加信息:
观察到的 ATLAS 的最小值和最大值没有异常值,时间分布在给定范围内。
我在https://gist.github.com/uweschmitt/768bd165477d7c14095e 上传了 i=500 的 ATALS 时间
给定时间来自不同的运行,因此平均值、最小值和最大值略有不同。
编辑:附加发现:
CPU 节流 (http://www.scipy.org/scipylib/building/linux.html#step-1-disable-cpu-throttling) 可能是原因吗?我对 CPU 节流知之甚少,无法判断它对我的测量结果的影响。很遗憾我无法在我的目标机器上设置/取消设置它。
【问题讨论】:
-
我在两个不同的文件夹中运行这个脚本,其中包含不同的 numpy.你的意思是,你得到其他时间的大小或分布?
-
链接文件很好,谢谢。
-
如果在
rand调用之前将numpy.random.seed(0)放入setup会发生什么? -
这不会改变观察到的偏差。
-
你也可以试试更大的尺码,看看差别是否仍然存在?
标签: python numpy benchmarking blas atlas