搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用

前言

本系列请点击:《搞一下TDA4》


所有系列请点击:《汽车电子系列分享》


众所周知,中间件是用于简化编程人员开发复杂度、抽象软硬件平台差异的软件抽象层。汽车电子领域有非常多的标准化软件规范和中间件,有一些是来源于ECU控制系统(如AUTOSAR),有一些是来源于工业界(如DDS、TSN)。


由于TDA4在国内有较多的应用。因此,搞一下汽车电子开辟一个全新的系列:" 搞一下TDA4 "


在德州仪器发布的TDA4VM的SDK中,采用了一种叫做OpenVX的软件中间件,
本文将分享一下OpenVX的背景知识,初步探讨一下在TDA4VM上的应用的特点。


全系内容可在《搞一下汽车电子》后台回复 “系列”,或进入菜单栏 “分享平台” --> “系列分享”


一、OpenVX的背景


OpenVX是由KHRONOS组织(https://www.khronos.org/)提出,并持续维护的API标准。该组织除了OpenVX之外还提出并维护OpenCL、OpenGL、OpenGL ES、Vulkan等标准。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第1张图片图片摘自https://www.khronos.org/


简单介绍一下几个主流标准的用途


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第2张图片


这些标准涵盖了3D图形、虚拟现实(VR)、增强现实(AR)、机器学习、视觉处理等等。全部都是免费供业界使用,并由几大芯片公司作为赞助商进行资助。


OpenVX的官网(https://www.khronos.org/openvx/)定义是:开放、免费的跨平台机器视觉加速标准。专门用于低功耗、性能有限场景下的机器视觉处理, 尤其是嵌入式实时计算,如人脸、人体、姿态的跟踪,智能视频监控、ADAS、目标和场景重建、VR和AR、机器人等等。


OpenVX官网也负责各大厂商产品的标准认证工作,官网上列出了经过conformance test认证的产品列表,里面包含了Raspberry Pi 4,RK3399,Qualcomm 820,TI AM57xx,Intel i5-6600等等。在这些平台上,都有OpenVX的实现,意味着同一份OpenVX的应用层代码可以在这些平台上跨平台适配。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第3张图片


相似的,算法工程师都会比较熟悉OpenCV这个视觉算法库,再次我们对比一下OpenVX和OpenCV的区别:


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第4张图片


从以上的比较可以看出,OpenVX主要依赖芯片厂家提供的加速库,OpenCV更多的是社区维护,可以应用于X86、GPU、ARM核心的通用图像处理函数库。


二、OpenVX具体细节


1、基本概念介绍


Vx_context
Vx_graph
Vx_node


以上三个概念是OpenVX的应用基础,每个进程内可以有多个context(上下文),每个context内可以有多个graph(图,或连接关系),每个graph内可以有多个node(节点)。


一个node就是一个最小的调度单元,可以是图像预处理算法,可以是边缘检测算法;一个graph就是一个功能,是由多个步骤连接在一起的完整功能;


一个context就是一个运行环境,包含多种不同的功能,在不同场景下被调度。一般很少有使用到多context的场景。


使用方法如下


创建过程


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第5张图片


释放过程


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第6张图片


2、基本数据结构


Vx_image
Vx_tensor
Vx_matrix
Vx_array
Vx_user_object_data



OpenVX规范了标准化的数据结构,基本满足了嵌入式系统的主要需求,尤其是这种数据结构的描述方法对嵌入式系统非常友好:
支持虚拟地址、物理地址等异构内存;
提供了数据在多种地址之间映射的接口;
提供了统一化的自定义结构体的描述方法。


使用方法如下


创建过程


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第7张图片


释放过程


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第8张图片


3、内存映射


通过创建这些数据结构,事实上并没有进行内存分配,只是创建了一个句柄。只有当显式地调用内存映射函数,或数据流即将开始运行的时候,才会按照各个node的要求进行内存分配。


使用方法如下


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第9张图片
搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第10张图片


Map函数会将用户提供的vx_image的句柄,根据提供的ROI范围(即rect参数),通道编号(即plane_index参数),读写方向(即usage参数),内存类型(即mem_type参数)以及其他特殊参数(即flags参数),转换成Linux端可以访问的指针(即ptr参数)。


同时这个Map和Unmap函数会自动处理多核之间的Cache一致性问题,避免多核使用共享内存导致缓存不一致的问题。


4、创建Node


Node创建的时候,一般需要提供所在graph的句柄,参数变量,以及它的输入变量和输出变量。


输入变量和输出变量的尺寸、数据格式等参数将会被用于Node的创建。在这个过程中,不会分配输入输出变量的实际内存,而只是建立一个连接关系:凡是使用了同一个变量的两个node会被标记为连接在一起,进而描绘出一个graph的完整连接关系。连接关系会被用于后续的Graph执行过程中。


Node的参数中,第一个参数必须是graph,其他的参数顺序和方向都由Node的设计者规定。这些参数可以是输入,可以是输出,也可以是配置参数。也允许数组的方式输入,进而实现不定数量参数的功能。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第11张图片
搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第12张图片


5、Graph的执行


前面的过程全部都是在构造graph里面node的连接关系,当graph构造完成后,即可调用vxVerifyGraph函数,交由OpenVX后端去检查参数是否合法。如果合法,即可调用vxProcessGraph函数,交由OpenVX后端将任务分发给特定的加速器和异构核心,等待全部计算完成后即函数返回。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第13张图片


如上图所示,系统在创建阶段处于IDLE状态,待所有的graph和node创建完毕后,即可通过vxProcessGraph函数启动graph的运行,进入运行状态,运行完成后即返回。也可以通过pipeline的API启动graph,此时graph会一直保持运行状态,由输入数据驱动,直到用户通过API停止graph。在停止graph后,可通过API释放资源销毁graph。


三、TDA4VM上的应用


结合TDA4VM来看,TDA4VM中有很多个核心和硬件加速器,OpenVX中部分标准API可以由这些硬件加速器实现,OpenVX的数据流调度的框架可以部署在AMP(异构非对称处理器)多核架构上。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第14张图片


1、数据流调度框架 (流水线)


在异构多核处理器中,流水线调度是提高系统并行度非常重要的一点。传统架构下,ARM大核+小核的SMP(对称多处理器)架构中运行的是一个OS,在这个OS里可以通过多线程的方法,将多个核心充分利用起来。如下图的两种方式:


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第15张图片


左图表示的是对于单一功能,多线程可以通过数据并行的方式加快计算速度,但是任务分发和同步会带来性能开销。


右图表示的是对于无法数据并行的处理任务,可以使用多线程的方式多个核心流水线的方式提高系统的并行度。这样系统的运行帧率取决于流水线中最慢的一个环节,而不是所有环节运行时间之和。


同样,在异构多核的处理器中,也需要流水线方式的并行加速。OpenVX提供了流水线(pipeline)的配置API,可以开启自动化的调度。流水线调度可以将传统编程方法中,一个线程从头到尾依次执行的速度大幅提高,不会造成加速器的闲置。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第16张图片


当OpenVX打开流水线开关后,OpenVX会自动在多个硬件加速器和不同核心之间建立流水线调度机制,每两个node之间会创建一个队列,用于缓冲流水线之间的速度差异。


Node间流水线运行机制


流水线相关的API相对抽象复杂,本文暂时不做具体分享


2、典型ADAS应用数据流示例


在典型的ADAS系统的图像处理功能里,会包含多种子功能:摄像头采集服务、行车记录仪功能、全景渲染功能、车位识别功能、障碍物检测功能、可行驶区域检测功能、前向目标检测等。


如下图,使用OpenVX可以规划为如下,摄像头图像采集作为一个graph为其他功能提供服务,低速、高速和常驻的功能分别独立作为一个graph,上层软件可以按照产品功能定义进行调度,将摄像头采集到的数据在某些工况下分发给特定的graph。


搞一下TDA4 | 01 OpenVX视觉加速中间件与TDA4VM平台上的应用_第17张图片


四、总结


最后总结一下OpenVX在TDA4VM上好处


TI官方提供OpenVX的支持,提供标准算法的硬件加速实现,提供各个功能的Demo,能够简化开发调试工作。
简化多核异构的开发,可以在X86模拟运行,所有的板级开发和调试都位于A72 Linux端,减少了对RTOS调试的工作量。
OpenVX提供了数据流调度机制,能够支持流水线运行,简化了多线程和并行调度的工作。结合RTOS的实时特性,减少Linux非实时操作系统带来的负面影响。


另一方面也存在一定的局限:
在完整的ADAS软件架构中,OpenVX仅可作为图像处理的中间件,无法用于异步事件和车辆控制等应用。因此,OpenVX作为加速器功能的封装可以被再次封装整合进更上层的中间件中(或各家自主规划的软件架构中)。

本期分享就到这里,欢迎大家一起交流学习,如果有不合理的地方也请大家指正,愿和大家一起学习进步,一步步做好汽车电子软件开发。

如果大家有想分享的内容,欢迎大家一起来分享! 更多内容请关注微信公众号《搞一下汽车电子》


更多其他内容,也可以随时与我们联系。


联系我们

微信:shactiontech
邮箱:[email protected]

你可能感兴趣的:(搞一下,TDA4,汽车电子系列分享,自动驾驶,机器学习,深度学习,TDA4)