性能比拼!超详细的Tengine GEMM矩阵乘法汇编教程
点击我爱计算机视觉标星,更快获取CVML新技术
Tengine 是OPEN AI LAB 针对前端智能设备开发的软件开发包,核心部分是一个轻量级,模块化,高性能的AI 推断引擎,并支持用DLA、GPU、xPU作为硬件加速计算资源异构加速。
本文为Open AI Lab 工作人员投稿,对深度学习的核心操作GEMM进行了详细的使用介绍,欢迎对模型部署AI推断感兴趣的朋友关注Tengine。
https://github.com/OAID/Tengine
很多刚入门Tengine的开发者想研读Tengine汇编代码,却苦于没有好的汇编入门教程,没有大神带入门,自己看又看不懂,怎么办?福利来了,Tengine带来了一份超详细的gemm汇编教程。
GEMM简介
什么是GEMM? 它的英文全称是 GEneral Matrix to Matrix Multiplication (通用矩阵的矩阵乘法),Gemm在神经网络的计算中占据很重要的位置。Why gemm is at the heart of deep learning[1]介绍了为什么GEMM在深度学习计算中如此重要,以及卷积计算中是如何使用GEMM。
教程大纲
教程分为三部分:
Step1: 纯C实现的gemm
Step2: 调用OpenBLAS的gemm
Step3: Tengine中的gemm
运行这个教程的代码,你需要:
可以执行armv8汇编的环境,比如RK3399
linux操作系统: 本教程的编译脚本使用的是Makefile
超简洁的教程源码
Step1: 纯C实现的gemm
step1部分的代码直接执行:
cd step1
make
./test
这个程序中我们计算的矩阵乘法是 A(m,k) * B(k,n) =C(m,n):
矩阵乘法的纯C简洁实现:
void gemm_pure_c(float* A, float* B, float* C,int m,int n,int k)
{for(int i=0;i<m;i++){for(int j=0;j<n;j++){C[i*n+j]=0.f;for(int p=0;p<k;p++){C[i*n+j]+=A[i*k+p]*B[p*n+j];}}}
}
Step2: 调用OpenBLAS的gemm
OpenBLAS[2]是一个开源的基础线性代数计算库,BLAS的英文全称Basic Linear Algebra Subprograms,它在不同的处理器上都做了优化。在Linux上,可以直接通过apt-get安装这个库:
sudo apt-get install libopenblas-dev
运行一下step2的代码
make
export OMP_NUM_THREADS=1
taskset 0x1 ./test
在RK3399上得到的结果是
[m n k]: 256 128 256
[openblas]: 4.68 ms
[pure c]: 32.22 ms
[blas VS pure_C]: maxerr=0.000076
可以看出,调用OpenBLAS库的性能明显优于纯C实现。
Step3:调用Tengine 16x4 kernel的gemm
这部分教程以 Tengine[3]源码中的 sgemm_4x16_interleave.S[4]为例子,对汇编代码做了一些简化,只支持k为4的倍数的情况。
在使用Tengine的4x16 kernel之前, 首先要对矩阵A和矩阵B的数据进行interleave。什么是interleave呢?Interleave叫交错排布,表示对数据进行重新排布,为了计算的时候读取数据时能更好地利用缓存。这里我们对矩阵A的数据是对m中的每16个元素进行重排, 对矩阵B的数据是对n的每4个元素进行重排。
Tengine的4x16 kernel计算的n=4,m=16的情况,目前支持的k是4的倍数:
我们在汇编代码的loop4中计算k的每四个元素.
加载B的数据到寄存器 v0,v1,v2,v3
加载A的数据到寄存器 v4,v5,v6,v7,v8,v9,v10,v11
ldr q0,[x1] ldr q1, [x1,0x10] ldp q2, q3, [x1,0x20]ldp q4, q5, [x2]ldp q6, q7, [x2,0x20] ldp q8, q9, [x2,0x40]ldp q10,q11,[x2,0x60]
下面的动图演示了4x16的kernel的每条指令是如何进行计算的
最后的汇编对应的是把输出数据保存
stp q16, q17 ,[x0]stp q18, q19 ,[x0, #0x20]stp q20, q21 ,[x0, #0x40]stp q22, q23 ,[x0, #0x60]stp q24, q25 ,[x0, #0x80]stp q26, q27 ,[x0, #0xa0]stp q28, q29 ,[x0, #0xc0]stp q30, q31 ,[x0, #0xe0]
我们在RK3399上执行step3的代码:
cd step3
make
export OMP_NUM_THREADS=1
taskset 0x1 ./test
可以看出, Tengine的4x16 kernel性能在这三种实现中是最优的。
[m n k]: 256 256 256
[tengine 4x16]: 7.71 ms
[openblas]: 9.55 ms
[pure c]: 316.00 ms
[blas VS tengine]: maxerr=0.000061
What's more?
这个教程的代码只是一个示例,part3的代码只支持:
m 是16的倍数
n 是4的倍数
k 是4的倍数
看完这个教程,建议可以尝试以下的一些拓展工作:
你可以修改代码来支持任意数值的k,可参考[sgemm_4x16_interleave.S][4]这个汇编代码,添加 loop1.
你可以把 interleave_B4 函数替换成汇编,以优化性能。
你可以拓展代码,支持任意数值的 m and n
你可以尝试写一个 4x4_kernel.S 的armv8汇编
你可以尝试写一个 4x4_kernel.S 的armv7汇编
教程源码链接或点击阅读原文获取:
https://github.com/lyuchuny3/Tengine_gemm_tutorial
Reference:
[1] Why gemm is at the heart of deep learning (https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/)
[2]OpenBLAS (https://www.openblas.net/)
[3]Tengine (https://github.com/OAID/Tengine )
[4]sgemm_4x16_interleave.S(https://github.com/OAID/Tengine/blob/master/executor/operator/arm64/conv/sgemm_4x16_interleave.S )
模型压缩与应用部署交流群
关注最新最前沿的神经网络模型压缩、减枝、AI推断技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)
(请务必注明:部署)
喜欢在QQ交流的童鞋,可以加52CV官方QQ群:805388940。
(不会时时在线,如果没能及时通过验证还请见谅)
长按关注我爱计算机视觉
性能比拼!超详细的Tengine GEMM矩阵乘法汇编教程相关推荐
- 如何在CPU上优化GEMM矩阵乘法
如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...
- 超详细的实现上传文件功能教程,文件上传实现。
重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 本文更新不及时,请到原文地址浏览:<超详细的实现上传文件功能教程,文件上传实现.>. 一.文件上 ...
- matlab 空矩阵耗时,性能 – 更快的方式通过空矩阵乘法初始化数组? (Matlab)
这很奇怪,我看到f更快,而g比你看到的慢.但是他们对我来说都是一样的.也许不同版本的MATLAB? >> g = @() zeros(1000, 0) * zeros(0, 1000); ...
- 超详细Xshell7免费版安装与连接虚拟机教程
一.下载Xshell 1.首先打开Xshell官网,首页官网地址为: Xshell官网首页地址 官网首页地址有时候会发生变动,若不能通过链接直接进入官网,则在浏览器搜索xshell---->点击 ...
- Linux内核UDP性能优化(超详细讲解)
现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...
- Nginx性能优化(超详细)
目录 一.性能优化考虑点 一.当前系统结构瓶颈 二.了解业务模式 三.系统与Nginx性能优化 1.文件句柄 (1)设置方式 (2)系统全局性修改和用户局部性修改 (3)进程局部性修改 2.cpu的亲 ...
- 【效率为王】超详细 Hexo + Github Pages 博客搭建教程
前言 现在市面上已经有许多博客了,比如 CSDN.掘金.博客园.简书等等.我们可以直接在上面发表内容,而且交互比较人性化,而且也能被搜索引擎检索到.但是总归是别人的平台,经常会受限,因此我们就希望能有 ...
- itunes store切换账户_超详细获得免费iTunes Store帐户教程
1.首先确定你的电脑中安装了iTunes软件,并且是较新版本.官方最新版点此下载:iTunes 7.5下载 输入你的EMAIL地址,下面两个框选中第一个(同意条款),第二个是将EMAIL地址加入该网站 ...
- 国仁网络资讯:如何运营好小红书上直播间;超详细直播互动话术攻略教程。
2020年,直播电商已经是大势所趋,各大短视频平台,内容社区也在积极布局直播业务.小红书直播经过半年的内 测之后,作为战略目标,小红书决定拿出30个亿补贴小红书直播.从一个海淘平台,到内容种草社区,再 ...
最新文章
- DIY最美数字女友!MIT开源最强虚拟人生成器,登Nature子刊
- Linux nethack
- selenium2与python自动化2-元素定位
- c# 运算符 ? ??
- Android项目实战(三十二):圆角对话框Dialog
- Docker学习笔记1 :镜像制作
- P2605 [ZJOI2010]基站选址
- Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理
- 旧调重弹-SetUnhandledExceptionFilter的使用问题
- 奇安信代码安全实验室帮助谷歌修复 Chrome 沙箱外高危漏洞,获官方致谢
- Git初学者:权威的实用指南
- windos下编译ffmpeg生成dll、lib库(开启265)
- 设备、线程-Android音频系统之AudioFlinger(二)-by小雨
- 小甲鱼Python教程学习笔记(一)
- python中实例是什么_Python里类和实例是什么
- 软件开发过程中的一些感悟
- C#解析mobi格式的文档
- Android MediaCodec 解码H264/H265码流视频
- wps文字下载 WPS Office 2012界面风格切换 想换就换
- 以太坊2.0协议核心Beacon链详解
热门文章
- MySQL之User(用户)和Privilege(权限)
- 爬虫学习一:HTTP、网页基础、requests、API、JS
- Oracle维护数据完整性——约束
- php要求输入是个数求平均值、_Excel表格技巧—如何在 Excel 中快速完成求和、平均值、百分比...
- python有哪些知识_Python有哪些基础知识
- 遇到oracle错误1012,跟着感觉走,解决安装RAC过程中OCR完整性错误,待深入剖析...
- c语言字符串英文,C语言字符串函数大全(国外英文资料).doc
- php输出学生成绩foreach,PHP中foreach输出值不正确
- 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点
- 学生渐进片add如何给_【收藏】为青少年验配渐进多焦点时,如何选择合适ADD?...