高性能计算(3)——BLAS调研和测试
【摘要】 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 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更好
另外一点是,随着矩阵规模的增大,增大线程数,单位时间内的计算量不增反降,也不太符合预期,我分析应该是由于线程的提升幅度跟不上计算量的提升幅度
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)