高性能计算(3)——BLAS调研和测试

举报
我是一颗大西瓜 发表于 2022/06/16 15:30:22 2022/06/16
【摘要】 BLAS (Basic Linear Algebra Subprograms)是 Netlib定义的一组向量和矩阵运算的API规范,如向量乘、矩阵乘等,同时Netlib也提供了自己用fortran实现的参考实现库,非并行版本,只做了基本的数据并行优化比如SIMD等,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 matrix
  • GB表示Banded matrix
  • SY表示symmetric matrix
  • SB表示symmetric banded matrix
  • SP表示symmetric packed matrix
  • TR表示triangular matrix
  • TB表示triangular banded matrix
  • TP表示triangular packed matrix

更多细节可以参考BLAS官网http://www.netlib.org/blas/

官网也提到了一些BLAS family and its cousins,还有各家供应商、开源组织也针对自己的硬件和需求提供了BLAS优化版本,针对硬件比如CPU架构进行优化、适配分布式并行、异构并行等版本,我的一些调研结果如下

按照一些网站提供的测试结果,在共享内存场景下,各家blas的性能主要是

i n t e l M K L > O p e n B L A S > A T L A S > B L A S   = N a i v e intel MKL > OpenBLAS > ATLAS > BLAS ~= Naive

为了验证这个结论,我在服务器上进行了矩阵乘向量的测试

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更好

另外一点是,随着矩阵规模的增大,增大线程数,单位时间内的计算量不增反降,也不太符合预期,我分析应该是由于线程的提升幅度跟不上计算量的提升幅度

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。