Performance Metrics(性能指标)分析选项卡可帮助识别是否需要对锁定停滞进行分析。以下步骤演示了如何在 Vitis 分析器中开始分析锁定停滞。
- 选择Trace(追踪)视图。
- 在Stalls(停滞)视图中,选中下拉列表中的Lock Stalls(锁定停滞)。提示: 这样Stalls视图即可随Trace视图、Graph视图和Array(阵列)视图一起使用。图 1. Trace视图中的锁定停滞每次停滞都包含下列关联信息。
- Stall ID(停滞 ID)
- 锁定停滞名为 LS_<NUM>。此编号在所有类型的停滞中都是唯一的。停滞发生时间越早,编号越小。
- Stalled Tile(停滞的拼块)
- 已停滞的内核所在的 AI 引擎 tile。
- Stalled Kernel(停滞的内核)
- 已停滞的内核。此内核名为
<Kernel_function_name>.<Schedule_ID>.<Graph_instance_name>
。有时,它显示为_main
,随后,需通过交叉探测来查找实际的内核函数。 - Start (ns)(开始 (ns))
- 停滞的开始时间。
- Duration (ns)(持续时间 (ns))
- 停滞的持续时间。
- PC
- 发生停滞时的程序计数器。
- Type(类型)
- 停滞的内核会尝试对缓冲器执行读取或写入。
- Buffer(缓冲器)
- 停滞的内核尝试读取或写入的缓冲器。
- Port(端口)
- 停滞的内核尝试读取或写入缓冲器时所使用的端口。
- Lock Holder(锁定保存器)
- 保存缓冲器的锁定的源代码。
- Related Stall(相关停滞)
- 可能导致停滞的其它停滞。 提示: 蓝色项可与其它视图进行交叉探测。
- 选中一行停滞。它将转至Trace视图中该停滞的开始位置。(可选)右键单击停滞并选择Filter Trace(筛选追踪)即可筛选与该停滞相关的所有信号。在Trace视图中,会显示与停滞相关的信号。不相关的信号则隐藏。如果采用大型设计,那么这样更便于浏览追踪。提示: Filter Trace可能无法显示与相关停滞存在关联的信号。
- Trace视图可用于查看时间线中的锁定停滞。对于特定锁定停滞,只需为其分配写入锁定和读取锁定即可查看。根据停滞的位置以及停滞前后的事件,可分析停滞原因。例如,如果已分配写入锁定并且锁定类型为“Read”(读取),那么这表示生产者尚未释放缓冲器。使用者正在等待该缓冲器变为可读。生产者可在Lock Holder中找到。
- 要清除先前筛选的追踪,请右键单击并选中Clear All Filters(清除所有筛选)。
- 在Graph视图中显示停滞路径的概览是很有帮助的。选中Graph视图,然后从该视图的下拉列表中选中Tile View(拼块视图)。Graph视图的Tile视图会显示 AI 引擎拼块内的 graph。图 2. Graph视图中的锁定停滞
- 如果Stalls视图未显示,请从下拉列表中选中Lock Stalls(锁定停滞),并选择要分析的停滞。它将高亮显示Graph视图的Tile视图中的相关路径。
- 红色路径显示的是停滞发生的位置。蓝色路径显示的是停滞发生的来源。
- 单击 PC 值。这样即可打开源代码并转至其中发生停滞的行。
图 3. 对源代码进行 PC 交叉探测人
下表列出了可能导致锁定停滞的场景以及可能的解决方案。
源 | 目标 | 目标 | 停滞类型 | 可能的解决方案 |
---|---|---|---|---|
AI 引擎内核 | 同步窗口锁定 | AI 引擎内核 | 锁定停滞 |
|
AI 引擎内核 | 异步窗口锁定(window_acquire 和 window_release API) |
AI 引擎内核 | 锁定停滞 |
|
PL 接口 | 窗口锁定 | AI 引擎内核 | 锁定停滞 |
|
AI 引擎 | 窗口锁定 | PL 接口 | 锁定停滞 |
|
注释: DMA 锁定停滞不包含在 Vitis 分析器锁定停滞分析内。