基准测试(python vs.使用BLAS的c ++)和(numpy)

问题:

我想编写一个广泛使用BLAS和LAPACK线性代数函数的程序。由于表现是一个问题,我做了一些基准测试,并且想知道,如果我采取的方法是合法的。
可以这样说,我有三位参赛者,想用简单的矩阵矩阵乘法来测试他们的表现。参赛者是:

  1. Numpy,仅使用dot的功能。
  2. Python通过共享对象调用BLAS功能。
  3. C ++,通过共享对象调用BLAS功能。

脚本

我为不同维度i实现了矩阵矩阵乘法。 i从5增加到500,增量为5,矩阵m1m2设置如下:

m1 = numpy.random.rand(i,i).astype(numpy.float32)
m2 = numpy.random.rand(i,i).astype(numpy.float32)

小胖子

使用的代码如下所示:

tNumpy = timeit.Timer("numpy.dot(m1, m2)", "import numpy; from __main__ import m1, m2")
rNumpy.append((i, tNumpy.repeat(20, 1)))

Python,通过共享对象调用BLAS

具有功能

_blaslib = ctypes.cdll.LoadLibrary("libblas.so")
def Mul(m1, m2, i, r):

    no_trans = c_char("n")
    n = c_int(i)
    one = c_float(1.0)
    zero = c_float(0.0)

    _blaslib.sgemm_(byref(no_trans), byref(no_trans), byref(n), byref(n), byref(n), 
            byref(one), m1.ctypes.data_as(ctypes.c_void_p), byref(n), 
            m2.ctypes.data_as(ctypes.c_void_p), byref(n), byref(zero), 
            r.ctypes.data_as(ctypes.c_void_p), byref(n))

测试代码如下所示:

r = numpy.zeros((i,i), numpy.float32)
tBlas = timeit.Timer("Mul(m1, m2, i, r)", "import numpy; from __main__ import i, m1, m2, r, Mul")
rBlas.append((i, tBlas.repeat(20, 1)))

3. c ++,通过共享对象调用BLAS

现在,C ++代码自然就要长一点了,所以我将信息减少到最小。
我加载功能

void* handle = dlopen("libblas.so", RTLD_LAZY);
void* Func = dlsym(handle, "sgemm_");

我用gettimeofday衡量时间,如下所示:

gettimeofday(&start, NULL);
f(&no_trans, &no_trans, &dim, &dim, &dim, &one, A, &dim, B, &dim, &zero, Return, &dim);
gettimeofday(&end, NULL);
dTimes[j] = CalcTime(start, end);

其中j是循环运行20次。我计算过去的时间

double CalcTime(timeval start, timeval end)
{
double factor = 1000000;
return (((double)end.tv_sec) * factor + ((double)end.tv_usec) - (((double)start.tv_sec) * factor + ((double)start.tv_usec))) / factor;
}

结果

结果如下图所示:
 enter image description here

问题

  1. 你认为我的做法是公平的,还是有一些不必要的开销我可以避免?
  2. 你会期望这个结果会在c ++和python方法之间显示如此巨大的差异?两者都使用共享对象进行计算。
  3. 既然我宁愿在程序中使用python,那么当调用BLAS或LAPACK例程时,我可以做些什么来提高性能呢?

下载

完整的基准可以下载here。 (J.F.塞巴斯蒂安使这个链接可能^^)

回答:

我已经运行your benchmark。我的机器上的C ++和numpy没有区别:
 woltan's benchmark

你认为我的做法是公平的,还是有一些不必要的开销我可以避免?

由于结果没有差异,这似乎是公平的。

你会期望这个结果会在c ++和python方法之间显示如此巨大的差异?两者都使用共享对象进行计算。

没有。

既然我宁愿在程序中使用python,那么当调用BLAS或LAPACK例程时,我可以做些什么来提高性能呢?

确保numpy在您的系统上使用BLAS / LAPACK库的优化版本。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Benchmarking (python vs. c++ using BLAS) and (numpy)

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 + 2 =