点击我爱计算机视觉标星,更快获取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矩阵乘法汇编教程相关推荐

  1. 如何在CPU上优化GEMM矩阵乘法

    如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...

  2. 超详细的实现上传文件功能教程,文件上传实现。

    重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 本文更新不及时,请到原文地址浏览:<超详细的实现上传文件功能教程,文件上传实现.>. 一.文件上 ...

  3. matlab 空矩阵耗时,性能 – 更快的方式通过空矩阵乘法初始化数组? (Matlab)

    这很奇怪,我看到f更快,而g比你看到的慢.但是他们对我来说都是一样的.也许不同版本的MATLAB? >> g = @() zeros(1000, 0) * zeros(0, 1000); ...

  4. 超详细Xshell7免费版安装与连接虚拟机教程

    一.下载Xshell 1.首先打开Xshell官网,首页官网地址为: Xshell官网首页地址 官网首页地址有时候会发生变动,若不能通过链接直接进入官网,则在浏览器搜索xshell---->点击 ...

  5. Linux内核UDP性能优化(超详细讲解)

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...

  6. Nginx性能优化(超详细)

    目录 一.性能优化考虑点 一.当前系统结构瓶颈 二.了解业务模式 三.系统与Nginx性能优化 1.文件句柄 (1)设置方式 (2)系统全局性修改和用户局部性修改 (3)进程局部性修改 2.cpu的亲 ...

  7. 【效率为王】超详细 Hexo + Github Pages 博客搭建教程

    前言 现在市面上已经有许多博客了,比如 CSDN.掘金.博客园.简书等等.我们可以直接在上面发表内容,而且交互比较人性化,而且也能被搜索引擎检索到.但是总归是别人的平台,经常会受限,因此我们就希望能有 ...

  8. itunes store切换账户_超详细获得免费iTunes Store帐户教程

    1.首先确定你的电脑中安装了iTunes软件,并且是较新版本.官方最新版点此下载:iTunes 7.5下载 输入你的EMAIL地址,下面两个框选中第一个(同意条款),第二个是将EMAIL地址加入该网站 ...

  9. 国仁网络资讯:如何运营好小红书上直播间;超详细直播互动话术攻略教程。

    2020年,直播电商已经是大势所趋,各大短视频平台,内容社区也在积极布局直播业务.小红书直播经过半年的内 测之后,作为战略目标,小红书决定拿出30个亿补贴小红书直播.从一个海淘平台,到内容种草社区,再 ...

最新文章

  1. DIY最美数字女友!MIT开源最强虚拟人生成器,登Nature子刊
  2. Linux nethack
  3. selenium2与python自动化2-元素定位
  4. c# 运算符 ? ??
  5. Android项目实战(三十二):圆角对话框Dialog
  6. Docker学习笔记1 :镜像制作
  7. P2605 [ZJOI2010]基站选址
  8. Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理
  9. 旧调重弹-SetUnhandledExceptionFilter的使用问题
  10. 奇安信代码安全实验室帮助谷歌修复 Chrome 沙箱外高危漏洞,获官方致谢
  11. Git初学者:权威的实用指南
  12. windos下编译ffmpeg生成dll、lib库(开启265)
  13. 设备、线程-Android音频系统之AudioFlinger(二)-by小雨
  14. 小甲鱼Python教程学习笔记(一)
  15. python中实例是什么_Python里类和实例是什么
  16. 软件开发过程中的一些感悟
  17. C#解析mobi格式的文档
  18. Android MediaCodec 解码H264/H265码流视频
  19. wps文字下载 WPS Office 2012界面风格切换 想换就换
  20. 以太坊2.0协议核心Beacon链详解

热门文章

  1. MySQL之User(用户)和Privilege(权限)
  2. 爬虫学习一:HTTP、网页基础、requests、API、JS
  3. Oracle维护数据完整性——约束
  4. php要求输入是个数求平均值、_Excel表格技巧—如何在 Excel 中快速完成求和、平均值、百分比...
  5. python有哪些知识_Python有哪些基础知识
  6. 遇到oracle错误1012,跟着感觉走,解决安装RAC过程中OCR完整性错误,待深入剖析...
  7. c语言字符串英文,C语言字符串函数大全(国外英文资料).doc
  8. php输出学生成绩foreach,PHP中foreach输出值不正确
  9. 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点
  10. 学生渐进片add如何给_【收藏】为青少年验配渐进多焦点时,如何选择合适ADD?...