GEMM优化(RISC-V平台)

在这里插入图片描述
本项目记录了在riscv平台上优化SGEMM(单精度浮点通用矩阵乘法)的过程。代码仓库位于https://github.com/Zhao-Dongyu/sgemm_riscv

通用矩阵乘(General Matrix Multiplication,简称gemm)是深度学习框架的核心计算单元之一,广泛用于ConvolutionFull connectionMatmul等算子实现。

我是在 全志 Nezha D1 开发板上进行的实验与探索,version 0 - version 5 是使用的 C 语言,version 6 - version 9 则部分使用了汇编,涉及到 RISC-V V 扩展指令。

注意:不同于其他的某些gemm优化工程,在本工程中,全部使用 行主序 的矩阵。因为我喜欢 行主序

预备知识

在这里插入图片描述

RISC-V 是一种开放标准指令集架构 (ISA),通过开放协作开启处理器创新的新时代。


在这里插入图片描述

GEMM 通用矩阵乘法,基本线性代数子程序之一。


FLOPS每秒浮点运算次数,亦称每秒峰值速度,(英语:Floating-point operations per second;缩写:FLOPS),即每秒所执行的浮点运算次数。一个 GFLOPS(gigaFLOPS) 等于每秒十亿(10^9)次的浮点运算;

矩阵乘的计算量是 2 * M * N * K,计算量除以耗时即为当前gemm版本的gflops。

  • 乘以 2 是因为每次操作包含一次乘法和一次加法

准备工作

相关代码位于 ./prepare/

测试交叉编译

我使用的 全志 Nezha D1 开发板,在这里下载的交叉编译链接。

详细教程见readme

内存带宽测试

分别通过以下几个小工程对开发板内存带宽进行测试

在这里插入图片描述

roofline模型

Roofline 提出了使用 Operational Intensity(计算强度)进行定量分析的方法,并给出了模型在计算平台上所能达到理论计算性能上限公式。

根据OpenPPL 公开课 | RISC-V 技术解析所说

  • D1的算力可达 4 GFlops(@1GHz)
  • Memory : 2.727 GB/s (DDR3 792 MHz)。
    • 虽然我测出来最高是2.592 GB/s,可能哪里出了问题?
    • 商汤还是要相信一下的,暂时以他的为准吧

在这里插入图片描述

sgemm优化

相关代码位于 ./sgemm/

使用说明

step0 为例,你需要先编辑 Makefile ,配置自己的交叉编译链。

$ cd sgemm/step0/
$ make
$ adb push test_bl_sgemm_step0.x ./.
$ adb shell './test_bl_sgemm_step0.x'

Version 0: naive版本

这个版本思路在我看来是最直观的,毕竟我当时就是这么学习理解计算矩阵乘法的:

A 的一行乘以 B 的一列得到 C 的一个元素。

在这里插入图片描述

<img src=https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fgithub.com%2FZhao-Dongyu%2Fsgemm_riscv%2Fblob%2Fmain%2Fpics%2Fstep0.gif&pos_id=img-FG36OOPj-1708998491920) width=70% />

优快云平台限制图片在5MB以内,所以计算过程的动图无法上传。如有需求可以去https://github.com/Zhao-Dongyu/sgemm_riscv/wiki查看

for ( i = 0; i < m; i ++ ) {
                 // Start 2-th loop
    for ( j = 0; j < n; j ++ ) {
             // Start 1-nd loop
        for ( p = 0; p < k; p ++ ) {
         // Start 0-st loop
            C( i, j ) += A( i, p ) * B( p, j );
        }                                 // End   0-th loop
    }                                     // End   1-st loop
}                                         // End   2-nd loop

我认为version 0非常契合的解释了 C m

<think>好的,我需要回答用户关于OpenBLAS库的问题。首先,我得回忆一下OpenBLAS的基本信息,然后组织成一个结构清晰的中文回答。用户可能想了解它的功能、特点、应用场景以及如何安装使用。 首先,OpenBLAS是一个开源数学库,主要用于高性能的线性代数运算。它是BLAS和LAPACK的实现,这点很重要,需要提到。接下来,它的核心功能包括基础线性代数子程序,比如向量和矩阵的运算,矩阵乘法、分解等。支持多线程和多种CPU架构,比如x86、ARM,这也是它的优势之一。 然后,主要特点应该分点说明。高性能是关键,可以对比其他实现如Intel MKL,尤其是在多核处理器上的优化。跨平台支持,比如Linux、Windows、macOS,还有ARM架构的应用场景如移动设备和服务器。接口兼容性,能够替换其他BLAS库,方便用户迁移,这点对开发者来说很重要。 应用场景部分,科学计算、机器学习、数据分析这些领域都需要高效的线性代数运算,举几个例子比如NumPy、TensorFlow依赖OpenBLAS。高性能计算中的大规模数值模拟和工程计算,这里可以强调其多线程和分布式计算的优势。 安装和使用部分,需要给出不同系统的安装命令,比如Debian系的apt,RedHat系的yum,macOS的brew。编译时链接库的例子,比如gcc编译,并提到环境变量如OPENBLAS_NUM_THREADS来控制线程数。 可能还需要提到常见问题,比如性能调优、线程数设置,以及如何选择适合的版本。最后,确保使用正确的中文术语,避免技术术语错误,结构要清晰,分点说明,让用户容易理解。 检查一下是否有遗漏的重要信息,比如开源协议、社区支持、与其他库的比较优势。确保LaTeX格式正确,但用户的问题中没有数学公式,所以可能不需要使用。不过根据系统指令,如果有数学内容需要用$...$,但这里可能不需要。确认回答符合所有系统级指令,特别是格式和语言要求。 最后,组织成一个连贯的回答,分章节介绍,确保逻辑流畅,信息准确可靠。</think>### OpenBLAS 库介绍 #### 1. **基本概念** **OpenBLAS**(Open Basic Linear Algebra Subprograms)是一个开源的**高性能数学库**,专注于加速线性代数运算。它是**BLAS**(Basic Linear Algebra Subprograms)和**LAPACK**(Linear Algebra Package)的高效实现,广泛应用于科学计算、机器学习和高性能计算(HPC)领域。 --- #### 2. **核心功能** - **基础线性代数运算**: - 向量操作:点积、向量加减法等。 - 矩阵操作:矩阵乘法(GEMM)、矩阵分解(LU、QR、SVD)等。 - **高性能优化**: - 针对多核CPU(如x86、ARM)和指令集(如AVX、NEON)优化- 支持多线程并行计算,充分利用现代处理器的计算能力。 - **接口兼容性**: - 完全兼容**BLAS Level 1/2/3**和**LAPACK**接口。 - 可无缝替换其他BLAS实现(如Intel MKL、ATLAS)。 --- #### 3. **主要特点** - **高性能**: - 在通用CPU上接近或达到商业库(如Intel MKL)的性能。 - 通过循环展开、缓存优化、汇编级代码调优提升效率。 - **跨平台支持**: - 支持Linux、Windows、macOS等操作系统。 - 适配多种架构:x86、ARM、RISC-V等。 - **开源免费**: - 基于BSD许可证,允许自由使用和修改。 --- #### 4. **典型应用场景** - **科学计算**: - 求解微分方程、线性方程组(如有限元分析)。 - 示例:$$ Ax = b \quad \text{或} \quad \min_x \|Ax - b\|_2 $$ - **机器学习与数据分析**: - 加速神经网络训练(如矩阵乘法)、支持库(如NumPy、TensorFlow)。 - **高性能计算**: - 大规模数值模拟(如气候建模、流体力学)。 --- #### 5. **安装与使用** - **安装方式**: - Debian/Ubuntu:`sudo apt-get install libopenblas-dev` - RedHat/CentOS:`sudo yum install openblas-devel` - macOS:`brew install openblas` - **代码调用示例(C语言)**: ```c #include <cblas.h> int main() { double x[] = {1.0, 2.0, 3.0}; double y[] = {4.0, 5.0, 6.0}; double dot = cblas_ddot(3, x, 1, y, 1); // 计算点积:1*4 + 2*5 + 3*6 = 32 return 0; } ``` - 编译命令:`gcc -o demo demo.c -lopenblas` --- #### 6. **性能调优建议** - **设置线程数**: - 通过环境变量控制:`export OPENBLAS_NUM_THREADS=4` - 避免与程序自身多线程冲突。 - **硬件适配**: - 根据CPU架构选择编译选项(如`TARGET=HASWELL`)。 - **动态/静态库选择**: - 动态库(`.so`/`.dll`)节省内存,静态库(`.a`/`.lib`)提升启动速度。 --- #### 7. **常见问题** - **与其他库的冲突**: - 若系统已安装其他BLAS库,需通过`update-alternatives`指定优先级。 - **性能波动**: - 确保CPU频率锁定(禁用省电模式),避免多任务干扰。 --- #### 8. **资源与社区** - **官方仓库**:[GitHub - OpenBLAS](https://github.com/xianyi/OpenBLAS) - **文档**:[OpenBLAS用户手册](https://github.com/xianyi/OpenBLAS/wiki) - **社区支持**: - GitHub Issues:提交问题和功能请求。 - 邮件列表:获取开发进展和优化建议。 --- ### 总结 OpenBLAS 通过高度优化的算法和硬件适配,为科学计算和机器学习提供了**免费的工业级性能**。其易用性、兼容性和跨平台特性,使其成为替代商业库的首选方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值