础滨驱动的设计应用
草榴社区 高级产物营销经理 Allen Watson
Percepio AB 首席执行官 Johan Kraft
如今,功能强大的视觉处理器可以实现出色的性能,但确保您的解决方案能够有效利用硬件,则要另当别论。实现系统运行时行为的可视化,就有助于加快开发、调试和验证速度。Percepio 开发的 Tracealyzer for OpenVX? 让您能够可视化 OpenVX 应用的执行,并确定哪些瓶颈经过优化能够产生显著效果。 Tracealyzer for OpenVX 适用于 草榴社区 DesignWare? ARC? EV6x 嵌入式视觉处理器,同时采用了 ARC MetaWare EV 开发工具包中内置的追踪支持功能。
嵌入式视觉应用通常被写作 OpenVX 图形 (graph)。OpenVX 是加速计算机视觉应用的开放标准,拥有许多嵌入式和实时用例。其中包括面部、身体和手势跟踪,智能视频监控,高级驾驶员辅助系统 (ADAS),对象和场景重建,增强现实,目视检查和机器人等应用。
OpenVX 图形 (graph) 由一个或多个内核构成。每个内核执行一项视觉功能,内核可以是标准 OpenVX 内核、自定义提供的内核,也可以是用户定义的内核(图 1)。
图 1:OpenVX 图形 (graph)
例如,如果使用诸如 ARC EV6x 处理器之类的视觉处理器,内核就可以在一个或多个视觉 CPU 或 CNN 引擎上运行(图 2)。处理器基于 OpenVX 的运行时软件能够管理内核的执行并处理存储器的分配和使用。
图 2:EV6x 处理器上基于 OpenVX 的运行时
确保尽可能高效地使用处理器硬件可能极具挑战性。例如,OpenVX 图形节点的处理时间可能超过预期,且造成一个芯核过载,而其他芯核在大多数情况下仍处于空闲状态。或者,某种应用可能会耗费大量时间等待 DMA 传输完成。您可能还尝试了通过添加更多计算资源来提高性能,但性能增益却低于预期。为了解决此类问题,Percepio 开发了一款可视化解决方案 - Tracealyzer for OpenVX。
利用该解决方案,您可以确定哪些瓶颈经过优化能够产生显著效果。Tracealyzer for OpenVX 提供了各种图形视图,显示记录行为的各个方面,种类涵盖详细的追踪视图、高级概览和统计视图等多个种类。本文介绍采用 Tracealyzer 工具所呈现的各种视图。
追踪视图显示 OpenVX 图形执行的时间表,以便您详细研究调度、流水线和时序。追踪视图可以通过多种方式进行调整,并支持水平和垂直显示。
例如,我们使用的是 Tracealyzer for OpenVX 提供的演示追踪 (“demo_openvx.xml”)。这是从 OpenVX 演示应用中获得的记录,另外带有追踪视图中的屏幕截图(图 3)。
图 3:OpenVX 演示应用
您会看到运行时软件如何使用两个芯核调度图形 (graph)。芯核 0 读取输入帧并将其提供给 sobel3x3 节点。然后使用 magnitude 和 convert_depth 滤波器在芯核 1 上进一步处理结果。处理是“运行到完成的工作方式”,因此追踪中的每个矩形(片段)都是一个单独的作业,无需抢占运行。滤波器函数的短片段是前置条件检查,长片段则显示实际的滤波器处理内容。
magnitude 节点可能会在 sobel3x3 节点完成之前开始,因为此示例中的 OpenVX 实现将每个帧划分为几块。一旦完成,一个节点就可能输出多个块并逐个写入输出缓冲器中。因此,假设节点在不同的芯核上运行,那么下面的节点(例如 magnitude)不需要等待整帧完成,而是可以在第一块可用时立即开始。这样就能高效利用芯核进行流水线处理。
图 4:追踪视图
图 4 中的追踪视图由标记为“CPU 0”和“CPU 1”的字段组成。每种字段会显示不同类型的信息。OpenVX 节点在“调度”字段中显示,要么是每个 CPU 芯核占一个字段(左侧示例),要么就是所有节点都在一个字段中(右侧示例)。
如需概括了解 OpenVX 应用如何利用 CPU 芯核,请查看 CPU 负载图,该图在垂直模式下显示两次(每个芯核一次)并带有视图(图 5)。CPU 负载图可供您查看 CPU 芯核的总负载,以及负载随时间变化的方式和每个节点导致的负载有多少。
CPU 负载图也可用作概览,方便您从中发现异常。例如,“sobel3x3”节点中的两个峰值(以红色显示)利用率约为 80-90%。您可以通过双击 CPU 负载图,在追踪视图中显示相应的部分,用来查看导致这些峰值的原因。
图 5:CPU 负载图
Tracealyzer 中的所有视图都以类似的方式相互连接,从而便于从高级概览向下提取到详细追踪。彩色标记更容易识别 OpenVX 图形 (graph) 节点。在所有 Tracealyzer 视图中使用统一的颜色编码。也可以打开 CPU 负载图的多个实例,或查看整合在单个 CPU 负载图中的所有芯核。请注意,在这一模式下,CPU 负载逐渐累积,因此两个芯核的负载规模可高达 200%。
CPU 负载图通过将显示的时间窗口划分为多个固定大小的时间区间(默认为 50)执行工作,然后计算每个时间区间内每个节点使用的处理时间量。结果显示为堆叠直方图,其中 Y 轴显示每个时间区间内的相对利用率。由于 CPU 负载的概念始终是相对于某个时间窗口(与您使用的工具无关),因此放大或者缩小参考时间窗口可能会改变 CPU 负载图的量级。放大很多时,大多数时间区间就只包含一个节点,因此图形就会和追踪视图相似。
在图 6 中,我们添加了两个 Actor 实例图的实例,其中 Y 轴显示了图形节点的执行时间。这样您就能看到哪里的节点执行时间超过正常水平,并检查追踪视图以了解详情。请注意,“Actor”是 Tracealyzer 术语,表示“执行环境”,对应 OpenVX 中的节点。
图 6:Actor 实例图
除了执行时间之外,Actor 实例图还可以显示各种时序属性,包括分段和周期性。您可以更改“执行时间”下拉菜单中显示的属性。
“Actor 统计报告”提供了追踪的统计摘要,包括针对时序属性(如执行时间)观察到的最高、最低和平均值。这份报告中的所有极端值都是链接形式,单击这些值即可查找追踪视图中的相应位置(图 7)。
图 7:Actor 统计报告
使用“Actor 统计报告”,您可以找到极值并查看系统中当时发生的情况。虽然报告没有记录所有细节,但您仍然可以调查导致这些值的原因,从而获得有价值的线索。例如,借助 Actor 实例图,您可以在追踪中找到其他执行时间较长的类似情况,并查看这些情况之间的关联性。也许执行时间较长只是出现在特定情况下,例如,在其他 CPU 芯核上的密集活动导致总线饱和。
请注意,您可以将统计信息报告导出并保存为格式化的 HTML 文件(如上所述)或标签文本文件(图 8)。标签文本文件方便将数据轻松导入到其他工具中,可通过选中“Actor 统计报告”对话框中的“数据导出”选项来完成。这使您可以对替代设计进行测量,并系统地比较最终的性能指标。例如,统计报告显示 IDLE0 占用 40.7% 的时间,表示芯核 0 的负载占用了 59.7%,而 IDLE1 仅占用 17% 的时间,表示芯核 1的负载占用了 83%。
图 8:标签文本文件格式的 Actor 统计报告
Tracealyzer 可让您添加自己的用户活动,即从应用代码记录的自定义活动。用户事件可让您直观查看应用中的任何内容,例如诊断消息、变量值和状态。
图 9 显示的示例中,用户活动已记录在两个用户活动通道上,“MyVariable”显示整数变量的值,“MyState”显示状态名称。Tracealyzer 可以通过多种方式显示这样的用户活动。例如,作为追踪视图 (1) 中的活动标签和作为活动日志 (2) 中的条目显示。利用用户活动信号图 (3),能够绘制用户活动提供的数字数据。
此外,如果系统中有重要的状态变量,则可以在 Tracealyzer 中将该状态更改记录为用户活动并定义状态机,以查看追踪视图时间表 (4) 中的这些状态。还能以状态机图 (5) 的形式查看状态变化摘要。您甚至可以定义“自定义区间”,来了解每个状态花费的时间,或任何两项活动之间的时间统计信息。
图 9:用户活动
上述示例用例基于 OpenVX 应用,该应用是利用 草榴社区 DesignWare ARC MetaWare EV 开发工具包针对 ARC EV6x 处理器而开发。
EV6x 嵌入式视觉处理器集成了一个、两个或四个高性能视觉 CPU,每个 CPU 由一个 32 位标量芯核和一个 512 位矢量 DSP 组成。它们可以包含优化的卷积神经网络 (CNN) 引擎,用于快速准确的物体检测、分类和场景分割。这类处理器完全可编程和可配置,融合了软件解决方案的灵活性和专用硬件的高性能和低功耗等特点。
ARC MetaWare EV 开发工具包提供了一整套工具、运行时软件和库,可通过 EV6x 处理器系列开发嵌入式视觉应用和机器学习应用。该工具包含有 MetaWare 编译器和调试器、ARC nSIM 指令集仿真器 (ISS)、EV 运行时和库、CNN 软件开发套件 (CNN SDK) 和 EV Virtualizer 开发套件 (EV VDK)。
必须快速调试、验证和优化软件,才能高效地开发先进的嵌入式视觉和 AI 应用。Percepio 的 Tracealyzer for OpenVX 可视化工具使设计人员能够使用 草榴社区 的 ARC EV6x 处理器 观察其软件的运行时行为并优化其应用,从而追求理想性能,同时加快 ADAS 和无人驾驶汽车等实时视觉应用的开发周期。
,深入了解 Percepio 开发的 Tracealyzer for OpenVX。