总览
总体介绍
-
UCP是什么?
统一计算平台(Unify Compute Platform,以下简称 UCP)定义了一套统一的异构编程接口, 提供应用程序接口(Application Programming Interface,以下简称API)实现对计算平台上所有资源的调用。 UCP将SOC上的功能硬件抽象出来并进行封装,对外提供基于功能的API,用于创建相应的UCP任务(如VP算子任务),并支持设置硬件Backend提交至UCP调度器, UCP可基于硬件资源,完成SOC上任务的统一调度。 具体提供了以下几个功能: 视觉处理(Vision Process)、 神经网络模型推理(Neural Network)、 高性能计算库(High Performance Library)、 自定义算子插件开发。
Backend相关介绍请查看 Backend说明 。
-
UCP应用场景:
单算子调用:可直接使用UCP中的视觉算子、高性能处理算子。
算子插件开发使用:可进行自定义算子的开发。
深度学习模型推理:可完成深度学习模型的推理任务,UCP内部完成模型的解析及硬件部署。
-
UCP的优势:
高度抽象:对于单算子的功能,不会受到硬件差异带来的困扰,可通过指定backend选择需要执行的硬件,降低硬件部署难度。
集成度高:作为地平线统一的异构编程接口,一套接口完成所有需求开发。
本章节用于指导如何使用UCP进行模型硬件部署等开发任务,具备基本的嵌入式开发的知识、经验和技能可以更好地理解本章节内容。
环境及工具
UCP适用于地平线J6及更高架构的计算平台,您需要具备基本的嵌入式开发的知识技能,以完成交叉编译、部署,使用环境及工具要求参考下表:
文中默认以Linux操作系统为例,介绍了UCP的使用方法,其他操作系统请参考文档内容,根据实际情况自行调整相关配置。
工作模式
UCP框架支持两种主要工作模式:直连模式和中继模式。系统默认运行在直连模式下。QNX操作系统和x86仿真不支持中继模式。
中继模式下,支持多进程任务的统一调度,使用中继模式前,首先启动 ucp_service,service文件位于 deps_aarch64/ucp/bin/service/ 路径下,
并通过设置环境变量 HB_UCP_ENABLE_RELAY_MODE=true 来启用Relay模式,使得用户进程可以通过中继服务进行通信。
无论是直连模式还是中继模式,UCP接口的调用方式保持一致,不会对编程逻辑产生影响。您可以根据实际需求灵活选择这两种模式,以满足系统在性能和灵活性方面的要求。
接口使用流程
UCP任务执行有三种方式:同步执行、异步执行、注册回调函数执行。 以调用VP接口hbVPRotate(hbVPRotate) 为例,说明三种任务执行方式。
三种方式的选择建议如下:
-
同步执行:调用后阻塞等待任务完成,不支持配置任务控制参数与选择Backend,UCP会根据当前任务可执行的Backend与硬件负载信息选择合适的硬件执行,适合流程简单、对任务调度没有定制要求的场景。
-
异步执行:提交任务后由您自行调用等待接口确认任务完成,支持配置任务控制参数与选择Backend,适合需要指定任务优先级或指定执行硬件的场景。
-
注册回调函数执行:提交任务后由UCP在任务完成时回调通知,无需在提交处阻塞等待,适合在任务执行期间还需要继续处理其他逻辑的流水线场景。
同步执行
创建任务时,将taskHandle对应的参数传入nullptr,可立即同步执行,参考代码如下:
异步执行
创建任务时,需要提前将taskHandle参数初始化为nullptr; 提交UCP任务(hbUCPSubmitTask)后,在线程指定位置执行接口(hbUCPWaitTaskDone),等待任务完成,参考代码如下:
注册回调函数执行
创建任务时,需要提前将taskHandle参数初始化为nullptr; 回调函数需要在任务提交(hbUCPSubmitTask)前注册,否则注册接口会报错。
如下给出设置回调函数的参考代码:
- UCP内置了Neural Network Kernel,Vision Process Kernel,以及High Performance Kernel,这些kernel算子可能由不同的backend支持,具体实现请查阅对应backend的支持情况。
- UCP任务调度统一按照优先级调度策略,提交任务时可指定任务执行的优先级。
- 同步执行不支持配置任务的控制参数和后端选择,UCP会根据当前任务的可执行backend,以及硬件负载信息,选择合适的硬件执行。
- 异步执行支持配置任务的控制参数和后端选择,不指定则基于各后端负载均衡选择。
- 除了视频编解码和图像信号处理任务,所有任务创建时的输入输出内存均需要您按照UCP提供的内存接口自行申请管理。
DEB部署包
本节介绍UCP提供的DEB部署包,以及安装、升级与卸载的命令示例。当您需要在板端快速准备UCP的运行环境,而不希望逐个上传二进制文件与依赖库时,可以使用DEB部署包完成部署。
阅读本节的前置条件是已经拿到OE发布物中的 ucp_tutorial/tools/deb/ 目录,并且板端可以执行 dpkg 命令。
QNX操作系统以及S6P平台暂不支持DEB部署包,本节内容仅适用于Linux操作系统。各系统与平台的功能支持差异请查看 功能支持度对比列表 章节。
UCP提供DEB部署包位于 ucp_tutorial/tools/deb/hbucp_aarch64_x.x.x.deb 路径下,该包旨在简化板端的部署过程,确保系统配置更加便捷和高效。
通过自动安装所需的二进制文件和相关依赖库,可以快速设置并运行UCP相关的应用程序。
成功安装DEB包后,二进制文件文件 ucp_service 和 hrt_ucp_monitor 将自动安装到 /usr/bin 目录,可以直接通过命令行访问这些工具。相关的动态库将安装到 /lib/aarch64-linux-gnu 目录,
确保所有运行时依赖都已正确配置。
在安装过程中,系统会自动配置所需的库路径,无需手动干预。这确保了在运行应用程序时,所有依赖库都能够被正确加载,进而保障系统的稳定性和可靠性。
安装命令示例
首次安装DEB包时,系统会提示安装过程中的版本信息。
upgrade安装命令示例
使用upgrade安装DEB包时,若安装过程失败,系统会自动回滚到安装前的版本。
卸载DEB包
如需卸载已安装的DEB包可参考如下命令:
Backend 说明
backend是指UCP任务执行时的后端计算硬件,当前UCP支持的backend包括BPU、DSP、GDC、STITCH、JPU、VPU、PYRAMID、ISP。
硬件特性描述
本节按硬件IP列出各平台的硬件特性指标,用于确认硬件本身的能力边界。若您需要确认某项功能在不同系统与平台上是否支持,请查看 功能支持度对比列表 章节。
DSP
GDC
STITCH
JPEG Processing Unit
Video Processing Unit
PYRAMID
ISP
x86仿真说明
除开发板外,UCP还在x86仿真环境下提供了与板端同样的开发能力支撑。
功能说明
与开发板端相同,UCP在 x86 架构上通过仿真形式提供了同样的视觉处理、模型推理和高性能计算能力,所有的示例及接口代码均可以在仿真环境中等效使用。 您可以在x86环境中进行代码开发和调试,开发过程中获得可即时反馈,并在早期发现和解决问题,从而提高开发效率和代码质量,以确保代码能够无缝迁移到SoC硬件上运行。
UCP支持的各Backend仿真方式如下:
- BPU和DSP硬件采用指令级仿真。
- GDC、JPU 和 VPU(Video Processing Unit)硬件采用CModel可执行文件仿真。
- GDC硬件使用的CModel可执行文件是
gdc_cmodel。 - JPU硬件使用的CModel可执行文件是
Nieuport_JpgEnc和Nieuport_JpgDec,分别用于JPEG编码和解码。 - VPU硬件使用的CModel可执行文件是
hevc_enc、hevc_dec、avc_enc和avc_dec。其中hevc_enc和hevc_dec分别用于H.265编码和解码,avc_enc和avc_dec分别用于H.264编码和解码。
- GDC硬件使用的CModel可执行文件是
- STITCH和PYRAMID硬件采用仿真库。
环境说明
编译环境
UCP仿真使用Docker镜像自带的编译器环境即可。
运行环境
- 使用DSP硬件进行仿真时,需要配置Xtensa开发环境并指定DSP仿真镜像路径。
环境配置方法可参考 DSP工具链安装 。指定DSP仿真镜像路径可以通过设置环境变量
HB_DSP_CMODEL_IMAGE,以确保应用程序能够找到正确的仿真镜像文件。 参考命令如下:
- 运行CModel可执行文件时,需要将可执行文件路径添加到PATH环境变量中,以便在终端可直接运行,参考命令如下:
- 其余硬件仿真运行时不需要进行额外的配置。
性能说明
但x86仿真环境下的性能通常会低于实际硬件的性能,主要原因如下: 前文我们提到,目前UCP支持的各Backend使用的仿真方式包括指令级仿真、CModel可执行文件仿真以及使用仿真库。
- 指令级仿真:指令级仿真方式需要逐条指令进行模拟和执行,从而导致较高的计算开销和较低的仿真速度。
- CModel 可执行文件仿真:CModel 可执行文件通过读写文件进行输入输出操作,而文件 I/O 操作较为耗时,在一定程度上会对仿真速度有所影响。
- 仿真库:仿真库运行在 CPU 上,CPU 模拟硬件加速器的行为,但 CPU 的架构和设计并不专门针对这些任务,因此运行效率较低。 尽管仿真环境下的性能通常低于实际硬件的性能,但仿真环境提供了完整的API支持和精确的功能验证,能够极大地提高您的开发效率和代码质量,有助于您在早期阶段发现并解决潜在的问题。
下一步看哪里
-
使用视觉处理相关接口,请查看 视觉处理(Vision Process) 章节。
-
使用神经网络模型推理接口开发板端应用,请查看 模型推理应用开发指导 章节。
-
使用高性能计算库中的算子,请查看 高性能计算库(High Performance Library) 章节。
-
开发自定义算子,请查看 自定义算子插件开发 章节。
-
确认某项功能在您使用的系统与平台上是否支持,请查看 功能支持度对比列表 章节。
