我们的工作一直都是重点针对VSLAM和VIO的工程化,放假回来更新一篇新的首发,也算是给CPU+DSP未来相关的工作做个抛砖引玉。
不知何年何月开始,摩尔定律就已经失效了(貌似是2009年?)
然后我们的时代正式进入了多核化与工程化,有没有一种感觉被智子锁定了的感觉~哈哈
在晶体管数量无法再在18个月翻番的基础上,科学家们只好用各种各样的处理器来进行工作的负荷分担,以实现我们所需要的工程并完成我们的产品。
其中最常见的就是GPU了,这个在前篇已经详述。
VIO的实时处理可以通过各种方法来实现。一个是GPU加速,它可以提高VIO性能。这种解决方案非常适合于对重量或大小限制不大的轮式机器人。但对于手动设备或无人机,这种耗电的解决方案其实是不好用的。
另一个很好的解决方案是在远程设备(如台式计算机、服务器)远程计算繁重的任务(如BA)。在这种情况下系统只需要发送测量数据并检索其他位置的姿态。虽然这是一个相当有效的解决方案,但它依赖于无线连接,另外会导致数据传输问题(失去连接,信号强度…)。
另外2个大类主要是DSP和FPGA,FPGA整体很复杂而且周期很长,后续如果写可能得分成几个系列,今天重点写一下DSP。
这篇文章的主体知识来自于2021年KTH的LOUIS MUFFANG的一篇论文和其中几篇很重要的引文:
其中有3块最重要的引文,尤其是第1篇,如果以后要在这一侧深化一定要完整阅读和实践,用的Xilinix-ZYNQ平台:
图像处理(特征检测)和IMU预测之间的并行化[1]。
使用线缓冲区[2]动态计算整个图像,从而避免使用全图存储
内存管理或利用线性化系统[3]中的矩阵的结构来存储内存管理。
这篇应该在海内外VIO和VSLAM研究者的相关研究中是很冷门的一篇。他的这篇写得很长,其中包含了大量的综述和VIO历史演进,我拜托老同事抽出其中的重点部分进行了一些实验发现确实可行,于是把重点部分写一下。
DSP就是数字信号处理器,这类东西在安防行业中过去一直用得很多,但是过去门槛实在是高,如果不是足够的懂时钟时隙根本就不适合去研究这个方向,过去在这个领域至少要深耕10年以上才能称之为合格的工程师。 但是我们当今的时代宛如三体里的“黄金时代”,基础科学并没有什么真正的鸟进步,应用技术却得到了极大发展,各种各样好用的工具如雨后春笋,给无数的工程师们提供了无所不能的错觉。~ 就如同今时今日的DSP,再也不是高不可攀。
后述是重点优化一种先进的单目视觉惯性里程计(VIO)算法,用于实时嵌入式系统资源应用。其中使用一个配备有数字信号处理器(DSP)的多处理器单元来加速和从CPU中分担任务。其目标是在不损害算法的速度和精度性能的情况下降低资源消耗。为此,团队将首先确定OPEN-VINS作为这项工作的合适算法,并找到需要优化的功能。当将优化后的DSP+算法和原始版本进行比较时,我们获得了类似的性能精度,在CPU上节省了超过×1.5的功耗,节省了超过×2的内存。这项工作在每个嵌入式系统中都发现了它的重要性。
主体拆解至DSP的部分也还是FAST和KLT,这2个东西是大通用就不赘述了,能找到的资料太多了,各家实现路径基本完全一致。
在嵌入式系统上,选择正确的硬件来保存大多数重复可利用资源是至关重要的。只有CPU的平台不适用于特定的任务,因为存在更有效的手段。当前的世界大量主流SOC配备了基于ARM的处理器和FPGA 或DSP ,允许针对特定任务的CPU负荷分担。
对FPGA和ASIC进行全硬件优化的是一个相当复杂的过程。FPGAs是一种硬件可编程的集成电路。使用VHDL (VHSIC-HDL,高速的集成电路硬件描述语言)。工程师们可以知道该采取哪个门来做某个操作。因此,FPGAs在矩阵运算、乘法和循环方面非常有效,功耗低。然而,FPGAs需要很长的开发时间,VHDL是相当挑剔的。
ASIC甚至比FPGA更节能,但它必须为特定的程序而设计和构建,这需要好十几个月的开发。这就是传说中的流片了:) 没钱就别想着搞啦,哈哈。
数字信号处理器(DSP):它可以专门用于VIO算法所需的复杂数学操作。与FPGA相比,DSP在能耗和性能上更差,但DSP比FPGA提供了更多的灵活性和简单性,因为近年来的它们可以直接运行C/C++或汇编代码。这可以极大的减少DSPs的开发时间。其中高通Qualcomm公司就像GPU领域的NV一样,是做出了巨大贡献的。
高通-骁龙8系列处理器除了CPU之外,还有一个集成的DSP,可以通过他们的软件开发工具包Hexagon sdk进行管理。这个DSP有不同的单元,用于特定的处理任务,例如,用于音频的ADSP或用于最新设备上的图像处理(高通-骁龙845及更高版本)的CDSP。
在特定硬件上的加速代码需要严格的方法。正如在引文[1]中所看到的,作者对他们的EKF解决方案进行了不同的迭代,从在CPU上运行它开始到FPGA实现。这方面的工作将使用类似的迭代方法。
软件优化部分:
软件和硬件的优化是非常接近的,因为他们紧密的关联着。因此,其余的工作将集中在带有CPU和DSP处理器的SOC上。
内存管理:
在DSP上和许多其他SOC一样,高通的SOC有其特定的内存管理。CPU和DSP共享缓存,但不共享RAM。随机存取内存(RAM)存储CPU使用的数据,而缓存更小更快,位于传统计算机上的RAM和CPU之间。这允许CPU(在本例中是DSP)更有效地获取数据。
内存分配应该正确地完成。非连续的内存块不适合用于DSP,因为它增加了读取数据的时间,并降低了程序的速度。虽然连续的物理内存将被优先排序,但最新的处理器提供了一个系统内存管理单元(SMMU),它添加了一个转换层来优化非连续内存块的处理。
内存在逻辑上分为三个部分:一个用于高级操作系统(HL-OS),由CPU使用,一个共享内存应该是连续的,以便DSP可以最优地读取它,以及一些变量可以在DSP上本地分配(见图2.6)。使用转换前向缓冲区(TLBS)将物理地址转换为每个处理单元的不同的虚拟地址。
RPC:远程调用
人们不能在一个ARM-CPU上以同样的方式在DSP上编译和运行代码。CPU需要通过远程过程RPC来调用DSP的相关函数。RPC是一种请求-响应协议,在此期间,客户端请求一个远程服务器(通常是另一台计算机)执行一个子例程,然后服务器响应该客户端。在一个多处理单元中,如这里有一个CPU和一个在同一芯片上的DSP,客户端是CPU,而“远程”服务器是DSP。
对于骁龙处理器,CPU通过FASTRPC与DSP通信,这是高通公司基于RPC的框架(资料挺多的),以便在CPU和DSP之间进行远程方法调用。其体系结构如图2.7所示。
ADSPRPC驱动程序对调用队列并等待的响应,而AD框架使消息的队列。子码由编译器生成,负责处理参数封送和解封送。
在来自客户端的每个调用时,存根代码从函数调用生成一个RPCC消息,ADSPRPC将其排队(队列化)。当接收到消息时,ADSPRPC框架将消息发送到SKEL代码,该代码将解封送参数并入调用对象中实现。处理完成后,反向重复类似的过程,将值返回给客户端。
骁龙845处理器允许在CPU和DSP之间处理异步消息。这有一些好处,因为CPU可以在不等待DSP队列时中发送许多新请求(负荷分担+加速)。例如,这可以用于处理同一图像的不同区域。一些值得一提的关键概念是:图像处理(特征检测)和IMU预测之间的并行化。
结合CPU负荷分担,可以使用上述方法来访问该算法。此外,高通还提供了一个计算机视觉库FASTCV,为他们的DSP进行了优化。不幸的是,它的详细实现和源代码还不可用,目前可用的功能也很有限。
最后给一个我个人非常重要的结论和经验:CPU+GPU能够对原有的前端进行更好的加速,但是对后端的处理基本没有助益,而DSP由于本身时钟频率较低,更多的时候只是起到了降低功耗和负荷分担(当然负荷分担本身也是一种加速)的作用,可以分别承接前后端的开销,另外可以大大节约内存。GPU的工作做不深的话远不如DSP,两者从长远看都不如FPGA,最终相信24个月左右之后,会有真正针对VIO的强力ASIC。