Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    太干了,OpenPPL做的RISC-V技术解析

    MR Series
    3
    4
    2072
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Y
      giao LV 6 last edited by q1215200171

      转自OpenPPL公众号:https://mp.weixin.qq.com/s/jw_8BSlZKjM9-0KBPqX2vw

      2月24日(周四)19:00,OpenPPL 实战训练营系列课程第七期,商汤科技高性能计算工程师焦明俊为大家带来了「OpenPPL RISC-V 技术分享」的专题课程。

      OpenPPL RISC-V 是针对全志 AllWinner D1 平台 RISC-V 架构的深度学习推理引擎。

      本期课程结合了 RISC-V V 指令集以及全志 D1 开发板的微架构特点,对推理引擎的算法设计进行技术解析。

      以下为本次公开课的课程总结~

      Part 1 | RVV 指令集概述
      Part 2 | AllWinner D1 微架构特点
      Part 3 | OpenPPL RISC-V 算法设计
      Part 4 | OpenPPL RISC-V 性能展示
      Part 5 | Q&A
      Part 6 | 课程表

      Part 1 RVV指令集概述

      1.1 RISC-V定义
      RISC-V 是一个基于精简指令集 risc 原则的开源指令集架构,其指令使用模块化设计,包括基本指令集以及额外可选择的扩展指令集。

      640.png

      1.2 微指令集的使用

      • 向量设置/控制指令

      • vsetvl、vsetvli —— 用来配置 vl、vtype 寄存器

      • 向量加载存储指令

      • vle.v、vse.v

      • 读取/修改向量寄存器指令

      • vmv.v.v、vmv.v.x、vmv.v.i

      • vrgather.v.v、vrgather.v.x、vrgather.v.i

      640 (1).png

      1.3 向量算数运算指令

      • vfadd.vv、vfadd.vf

      • vfsub.vv、vfsub.vf

      • vfmul.vv、vfmul.vf

      • vfdiv.vv、vfdiv.vf

      • vfmacc.vv、vfmacc.vf

      • 对比 arm neon :vfma —— 支持向量-向量元素乘累加操作

      640 (2).png

      Part 2 AllWinner D1 微架构特点

      2.1 C906 处理器的体系结构特点(用户手册)

      • 支持 RV64 IMA[FD]C[V]指令子集

      • 5级单发射顺序执行流水线

      • 一级哈佛结构的指令/数据缓存(各32K)

      • 算力可达 4GFlops(@1GHz)

      • 遵循 RVV 向量扩展标准(RVV 0.7.1)

      • 支持 int8/ int16/ int32/ int64/ fp16/ fp32/ fp64/ bfp16 向量运算

      2.2 性能参数实测

      • 指令吞吐

      通过构建无数据依赖的相互独立的指令流来测试每条指令的执行周期数(CPI)。

      • 指令延迟

      通过构建具有写后读相关性的指令流序列来测试不同指令的执行延迟。

      • 访存带宽

      通过构建 Cache 命中率为百分百和零的两种指令流分别测试 Cache 和主存 DDR 的带宽。

      2.3 实测性能参数结果

      • 指令吞吐、指令延迟

      640 (3).png

      • 访存带宽

      Cache :8 GB/s

      Memory : 2.727 GB/s (DDR3 792 MHz)

      • 构建roofline模型

      640 (4).png

      Part 3 OpenPPL RISC-V算法设计

      3.1 通用GEMM KERNEL的设计

      • 向量广播乘累加操作性能分析

      1. 由于采取 NBCX 的数据排布,需要将 V0 各通道元素广播分别与 V16 进行乘累加

      640 (5).png

      2)相关代码

      640 (6).png

      i. 代码左:2 * 4 + 2 * 4 = 16 (cycle)

      ii.代码右:2 + 3 * 3 + 2 = 13 (cycle)

      3)由于需要使用 gather 指令

      i. 占用了向量寄存器

      ii.添加了与计算无关的寄存器间数据传递指令

      • gemm_kernel 的设计

      假设数据都在Cache中并且k足够大,在寄存器的约束下寻找最合适的kernel size (m/n)来达到最高的gemm_kernel性能。

      1. 方式一:

        权重、输入均放入向量寄存器,使用向量-向量(vv)算数指令计算

        weight/input : vle.v、vse.v

        compute: vfmacc.vv

      640 (7).png

      1. 方式二:

        权重放入向量寄存器,输入放入标量寄存器,使用向量-标量(vf)指令计算

        weight : vle.v、vse.v

        input : flw

        compute : vfmacc.vf
        640 (8).png

      • 不同kernel size下计算指令的占用率

      1. vv指令在不同kernel size下计算指令的占用率

      640 (9).png

      1. vf指令在不同kernel size下计算指令的占用率

      640 (10).png

      1. 对应到roofline模型中的位置

      640 (11).png

      3.2 gemm实现的两种选择

      640 (12).png

      naive-gemm 优劣

      • 需要开辟一块额外内存空间用来存放整张图的 im2col 结果

      • im2col 过程仅需一次

      • 由于Cache大小的局限性,无法合并 im2col 与 tiling 流程

      • 非 1x1 卷积核下,无额外 tiling 开销

      tile-gemm 优劣

      • 仅需一小块 tile 大小的内存空间来存放 tile 的 im2col 结果

      • 由于 Output Station 的循环计算策略,im2col 过程需要执行多次

      • 可合并 tiling 与 im2col 流程,并将结果直接送入 Cache 中

      • 非 1x1 卷积核下,在原图上 tiling 划分会有重叠数据开销

      • 举例:

      在IC较大的网络下,添加 naive-gemm对性能提升的效果。

      640 (13).png

      3.3 快速卷积算法-Winograd分析

      • direct conv

       Td = OC * OH * OW * IC * f * f * 2
      

      • winograd conv
      640 (14).png
      640 (15).png

      • 加速比

      640 (16).png

      分析

      • 随着 IC/OC 的增大, TBTdB / TATMA 两者减小,加速效益更明显

      • 以上 IC/OC 较大的前提下,

       • f 固定,随着 b 的增大,加速效益更明显
      
       • b 固定,随着 f 的增大,加速效益更明显
      
          • f 为 1 时,加速比为 1
      

      640 (17).png

      • Winograd算法提升性能的本质

      640 (18).png

      Part 4 OpenPPL RISC-V性能展示

      4.1 OpenPPL RISC-V使用方式

      fp32 测试

      • ./pplnn --use-riscv -- onnx-model model.onnx --inputs input.bin

      fp16 测试

      • ./pplnn --use-riscv --use-fp16 --onnx-model model.onnx --inputs input.bin

      其他命令设置项

      •--help :显示所有命令设置项

      •--enable-profiling :显示网络性能分析详细结果

      •--save-inputs :保存输入数据到指定文件

      •--save-outputs :保存输出数据到指定文件

      •--min-profiling-iterations :设置最小profiling迭代次数

      •--wg-level :设置winograd快速算法级别

      4.2 性能结果

      640 (19).png

      OpenPPL在 fp16 和 fp32 精度上均能够达到平均 1.5 倍于框架A的性能。

      4.3 OpenPPL RISC-V开发计划与展望

      支持更多的网络模型和算子

      • 语义分割、目标检测等网络

      • 视觉 CV 算子

      支持

      • 兼容 RVV 0.7.1 和 RVV 1.0 标准版本

      • 可变长 VLEN 支持

      Part 5 Q&A

      Q1. Tile-gemm 的优势 case 有多快?
      Tile-gemm的优势在于,在tile划分较少的情况下,它相对于naive-gemm会有比较大的优势。这种情况下,在一些比较小的网络里面会有一些比较好的效果,比如mobile net。具体数据可以在微信群做进一步探讨。

      Q2. RISC-V 上 depth-wise 卷积有优势吗?gemm kernel 的性能是多少?

      关于depth-wise卷积,这边暂时没有去做具体的测试,但据了解应该是不会有劣势的。

      关于gemm kernel的性能上限,可以参考内容截图。如果使用vv的计算方式,理论上限大概在50%,理论峰值就是4GFLOPs的50%左右;但如果使用vf指令,能够达到它理论峰值的80%,即4*80%,3.2GFLOPs。

      1 Reply Last reply Reply Quote Share 0
      • nihui
        nihui LV 6 last edited by

        于是框架A是ncnn嘛?
        😊

        Y aldfaaa 2 Replies Last reply Reply Quote Share 0
        • Y
          giao LV 6 @nihui last edited by

          @nihui 要对ncnn有信心🙃

          1 Reply Last reply Reply Quote Share 0
          • aldfaaa
            whycan矿工-小叶 LV 7 @nihui last edited by

            @nihui 😂

            1 Reply Last reply Reply Quote Share 0
            • 1 / 1
            • First post
              Last post

            Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

            行为准则 | 用户协议 | 隐私权政策