高性能计算(3)——BLAS调研和测试
BLAS (Basic Linear Algebra Subprograms)是 Netlib定义的一组向量和矩阵运算的API规范,如向量乘、矩阵乘等,同时Netlib也提供了自己用fortran实现的参考实现库,非并行版本,只做了基本的数据并行优化比如SIMD等,BLAS主要提供了三层操作,主要接口如下:
- Level 1: 标量、向量和向量间的操作
- Level 2: 矩阵和向量间的操作
- Level 3: 矩阵和矩阵间的操作
这里的x表示BLAS提供了不同精度的运算
S
表示单精度运算D
表示双精度运算C
表示单精度复数运算Z
表示双精度复数运算
设计矩阵运算时,第二个字母和第三个字母表示不同矩阵类型的运算
GE
表示General matrixGB
表示Banded matrixSY
表示symmetric matrixSB
表示symmetric banded matrixSP
表示symmetric packed matrixTR
表示triangular matrixTB
表示triangular banded matrixTP
表示triangular packed matrix
更多细节可以参考BLAS官网http://www.netlib.org/blas/
官网也提到了一些BLAS family and its cousins,还有各家供应商、开源组织也针对自己的硬件和需求提供了BLAS优化版本,针对硬件比如CPU架构进行优化、适配分布式并行、异构并行等版本,我的一些调研结果如下
按照一些网站提供的测试结果,在共享内存场景下,各家blas的性能主要是
为了验证这个结论,我在服务器上进行了矩阵乘向量的测试
Naive implementation
for (int i = 0; i < LOOP; i++>) {
for (long long m = 0; m < ms; m++) {
for (int n = 0; n < ms; n++) {
c[m] += A[m * ms + n] * b[n];
}
}
}
BLAS (using netlib-CBLAS)/ OpenBLAS/ Intel MKL BLAS
for (int i = 0; i < LOOP; i++) {
cblas_dgemv(CblasRowMajor, CblasNoTrans, ms, ms, 1.0, A, ms, b, 1, 0.0, c, 1);
}
由于OpenBLAS用OpenMP做了并行优化和MKL有自己的线程设置选项,因此分别测了不同线程设置下的结果
结果是OpenBLAS > MKL > CBLAS ~= Naive
比较不符合预期的是OpenBLAS的平均性能比MKL要好,并且峰值性能更高,我分析可能是没有用上icc编译器,也就是自家的编译器,但通用场景下还是OpenBLAS更好
另外一点是,随着矩阵规模的增大,增大线程数,单位时间内的计算量不增反降,也不太符合预期,我分析应该是由于线程的提升幅度跟不上计算量的提升幅度
- 点赞
- 收藏
- 关注作者
评论(0)