与链接到 OpenBLAS 的 numpy 相比,我尝试评估链接到 ATLAS 的 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 时间
给定时间来自不同的运行,因此 avg、min 和 max 值略有不同。
编辑:附加发现:
CPU节流(http://www.scipy.org/scipylib/building/linux.html#step-1-disable-cpu-throttling)可能是原因吗?我对 CPU 节流知之甚少,无法判断它对我的测量结果的影响。遗憾的是我无法在我的目标机器上设置/取消设置它。