对BLAS库进行基准测试

对BLAS库进行基准测试

BLAS代表基本的线性代数子例程,连同它的扩展的LAPACK -线性代数包,它们组成了大多数机器学习算法的数学库。在任何ML程序的最低级别上,所有内容都可以转换为一系列数字、数组、矩阵、张量和这些结构上的数学操作。这些数学运算构成了ML的基本原子元素。

由于我们讨论的是ML的基础层,因此在这个层次上发生的任何加速都将推动使用它的几乎所有算法。这就是为什么我们在DataThings上花费了大量的时间和精力去理解、实验和测试这个库的不同实现,以便在性能和效率方面打败市场上的机器学习解决方案。

在这篇博文中,我们将展示在4个不同的BLAS实现上测试6个数学操作得到的结果。

我们基准的BLAS实现如下:

  • Openblas(最优和最着名的BLAS库之一)
  • Eigen 3.3.4(线性代数的C ++模板库)
  • CuBLAS + CuSolver(利用GPU并行性的Nvidia的BLAS和LAPACK的GPU实现)

基准测试使用英特尔®酷睿™i7-7820X CPU @ 3.60GHz,64 Gb内存和NVidia GeForce GTX 1060 6GB。

基准

这里给出了基准测试和结果的操作。对于每个矩阵大小,我们运行模拟100次并平均每个操作,每个矩阵大小和每个BLAS库所花费的时间。最短的时间显然是最好的。以绿色突出显示。第二个最佳选项是橙色,最后一个选项是红色。

矩阵乘法(ML中最常用的操作,几乎无处不在)

对BLAS库进行基准测试

矩阵求逆(用于具有多个未知数的方程求解器)

对BLAS库进行基准测试

QR分解(用于具有多个未知数的方程求解器)

对BLAS库进行基准测试

LU分解(用于具有多个未知数的方程求解器)

对BLAS库进行基准测试

SVD分解(在PCA等算法中用于查找自变量并减少数据空间)

对BLAS库进行基准测试

EVD分解(在PCA等算法中用于查找自变量并减少数据空间)

对BLAS库进行基准测试

结论

对于小矩阵尺寸,Eigen是最快的。大多数时候,某个阈值矩阵大小后,Cuda接管(除了矩阵求逆和奇异值分解)。我想这是因为cuda库还在开发中,并不是所有的函数都是优化的。

从这些基准测试中我们可以看到,至少需要大约100x100的矩阵大小才能开始有利于支付将数据从CPU传输到GPU的成本,并在Cuda上运行计算。

相关推荐