记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

面向RISC-V的辅助驾驶典型算法的移植、评测与启示(三)

2021-09-09 13:31
寄存器评测与启示

问题的提出与分析

为了获得良好性能,程序执行过程中变量应该尽量放在寄存器中。寄存器是CPU读取数据最快的方式。从RISC-V的汇编文件中也可以看到,除了读内存和写内存的指令,其它一般指令计算的对象是寄存器而非内存。由于RISC-V指令集模块化的特点,RISC-V不同指令集使用的寄存器组是不同的。通用寄存器组x0-x31是由整数指令集I、乘除法指令集M、原子指令集A和压缩指令集C共同使用的,而浮点指令集F和D使用单独的浮点寄存器f0-f31。

在汇编程序和RISC-V指令中,寄存器使用应用程序二进制接口(ABI)名称表示。在程序的函数调用过程中,需要保存函数内部的变量和返回地址等不变量,为避免频繁地保存和恢复寄存器,RISC-V设计了“保存寄存器”和“临时寄存器”:保存寄存器的值在函数调用前后不会发生改变,而临时寄存器的值在函数调用中将会被随机更改。

RISC-V的保存寄存器和临时寄存器不是连续编号的,这是RISC-V为了支持嵌入式指令集RV32E。RV32E也是整数指令集,它的指令与RV32I相比没有变化,但是只使用前16个通用寄存器,通常用于嵌入式系统中。

考虑到ADAS的车载嵌入式平台资源有限,而一些寄存器的使用占比不高,如果可以去除一些不常用的寄存器,或者选择RV32E作为基础整数指令集,将能有效地降低硬件的设计与实现成本,降低平台能源消耗。本评测实验旨在量化分析ADAS算法中所有寄存器的使用占比,为精简寄存器设计提供相关的数据参考,并给出寄存器精简设计的相关启示。


评测的实验方法设计

为获得ADAS算法对所有寄存器的使用占比,需要分析其对应的RISC-V指令。在Spike平台上,Debug模式可将ADAS算法运行过程中所有的RISC-V指令及相关的输出信息打印在控制台,或保存为具体的文件。本实验方案将通过文件保存Spike模拟器在Debug模式下的输出,从而得到具体的执行指令文件。

本实验中,ADAS算法由目标检测、目标跟踪、行为决策三个部分组成,考虑到各个算法的不同特性,本文将综合分析比较ADAS的检测、跟踪、决策算法对寄存器的使用占比,并根据三个算法的实验结果统计出ADAS算法的整体情况。

实验过程中发现,基于神经网络的算法在网络层较为复杂或者层数较深时,例如目标检测的YOLO算法,产生的RISC-V指令数目会达到上亿甚至百亿,相应的指令文件体积也会非常大,需要借助特殊工具如EmEditor来处理。

本实验中,任一寄存器res的使用占比可通过公式1计算:

       (1)

其中ratio(res)表示寄存器res的使用占比,num(res)表示RISC-V指令使用该寄存器的次数,num(all)表示所有寄存器使用的次数。


评测结果与分析

本部分分别对ADAS系统检测、跟踪与决策模块中寄存器的使用情况进行统计和分析,并进一步分析和讨论ADAS算法整体的寄存器占比。各算法对通用寄存器的使用占比结果如表1所示。


表1  各算法及ADAS整体系统的通用寄存器使用占比情况


图1给出了各算法及ADAS整体系统的通用寄存器使用占比折线对比图。

图1  各算法的通用寄存器使用占比折线对比图


从以上实验结果可以看出,各个算法对不同寄存器组的使用呈现出相似的占比情况。具体来说,不论是三个不同的算法模块还是ADAS系统整体,前16个寄存器的使用占比高达80%左右,其中x10-x15寄存器使用占比最高。且从一般规律来看,临时寄存器1(保存寄存器1)的使用占比都比临时寄存器2(保存寄存器2)高。基于上述实验现象,可以推断,RISC-V在为数据分配寄存器时会优先选择序号靠前的寄存器。

从表1中也可以看出,检测算法对临时寄存器(保存寄存器)的使用呈现出相反的规律,即临时寄存器2(保存寄存器2)的使用占比更高。分析原因,这是由于大型神经网络的计算需要保存大量的中间数据,因此所有寄存器的使用将达到“满载”的情况。

对于浮点寄存器的使用占比,表2给出了各算法及ADAS整体系统的统计结果。


表2  各算法的浮点寄存器使用占比情况


各算法及ADAS系统的浮点寄存器使用占比折线对比图如图2所示。

图2  各算法的浮点寄存器使用占比折线对比图


从上述实验结果可知,各算法及ADAS整体系统对浮点临时寄存器1(保存寄存器1)的使用占比均大于临时寄存器2(保存寄存器2),说明浮点寄存器的设计仍有很大的精简空间。从拆线对比图中可以看出,决策算法对浮点寄存器的使用占比与其他算法有较大区别。具体表现为临时寄存器使用很少,保存寄存器和浮点参数寄存器使用较多。这是由于决策算法没有大量的函数调用过程,大部分计算都在决策功能函数里完成,因此寄存器将主要用来保存功能函数里的参数数据。整体来看,临时寄存器2提供了很大的优化空间。


启发性思考

从以上实验结果中可以看出,无论是通用寄存器还是浮点寄存器,寄存器都存在使用不均衡的问题。对于通用寄存器,ADAS的检测、跟踪、决策算法都对前16个寄存器使用占比更高,ADAS整体算法达到了78%以上,远高于后16个寄存器。因此,在资源受限时,ADAS系统支撑平台可考虑只使用前16个通用寄存器的RV32E指令集作为基础整数指令集。由于Spike模拟器目前无法支持RV32E,对于减少寄存器后ADAS系统的性能暂时无法进行比较,在后续的工作中可以考虑以下方案来评测通用寄存器减少对上层应用的影响:

1、目前Spike平台可生成RISC-V的汇编文件,因此可以考虑更改生成的汇编程序文件,在保证程序功能逻辑不变的情况下,将后16个寄存器用前16寄存器替代,以此来评测程序性能的前后对比。

2、在硬件平台资源允许的情况下,实现支持E指令集的RISC-V CPU,对比ADAS应用分别在RV32E和RV32I CPU上的性能差异。并重点关注速度的前后对比,由于寄存器减少,CPU不可避免地需要更多地与内存发生数据变换,因此将会产生更多的load与store指令。

从对浮点寄存器的评测结果中看出,f20-f31在ADAS三类算法中的使用的占比都是比较低的,且从统计数据中可以看出,在功能相同的连续几个寄存器中,前面寄存器使用的占比普遍更高,因此可以考虑去除保存寄存器或者临时寄存器的后面几个使用占比较低的寄存器。

 
后记

这一部分我们主要对ADAS系统中寄存器的使用情况进行了评测。各类寄存器的使用占比的统计分析结果表明,ADAS算法对通用寄存器前16个寄存器使用占比较高,且对部分浮点寄存器的使用占比很低,因此面向ADAS算法的RISC-V平台可考虑选择RV32E作为基础整数指令集,且可以有选择性地去除一些不常用的浮点寄存器。

通过上述三个系列文章的工作,我们主要探索了ADAS系统中检测、跟踪、决策三类典型算法向RISC-V平台的移植过程,并对ADAS算法在RISC-V平台上的相关资源使用情况及性能进行了评测(包括内存、算力与寄存器等各方面),得到了一些有益的结果和启示。希望我们的研究工作对感兴趣的读者和研究人员有一定的帮助和启发。


往期回顾


知识来源: ?id=b5ba01458e20d99efab4b71112298ff8&source_url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2F7kVj4TM3SRwLfA_ikb_-dg

阅读:20608 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“面向RISC-V的辅助驾驶典型算法的移植、评测与启示(三)”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

求赞助求支持·广告位💖

标签云