暂时性数据并行化:主机到内核数据流 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

有时,计算单元所处理的数据经由内核中的某一个处理阶段,进入下一个处理阶段。在此情况下,内核的第一个阶段可能处于空闲状态,可开始处理一组新数据。从本质上来看,内核就像是工厂组装线,它可以在接受新数据的同时,使原始数据沿组装线下行。

为了理解这种方法,假定内核在 FPGA 上只有 1 个 CU,主机应用会以多组不同数据对内核进行多次排队。如 使用主机指针缓冲器 中所示,主机应用可以在内核执行前将数据移植到器件全局存储器上,从而隐藏内核执行产生的数据传输时延,实现软件流水打拍

但默认情况下,每个内核只有在完成处理当前数据组之后才能开始处理一组新数据。虽然 clEnqueueMigrateMemObject 可以隐藏数据传输时间,但多次内核执行仍保留按顺序执行的方式。

通过启用主机到内核数据流,可以进一步提升加速器性能,方法是在内核仍在处理前一组数据的同时就以一组新数据来重新启动该内核。如 启用主机到内核的数据流 中所述,内核必须实现 ap_ctrl_chain 接口,并且必须编写为允许分阶段处理数据。在此情况下,一旦内核能够接受新数据,XRT 就会重新启动内核,从而重叠多次内核执行。但主机应用必须使用请求来保持命令队列处于填满状态,以便内核一旦准备好接受新数据后即可立即重新启动。

以下是主机到内核数据流的概念图。

图 1. 主机到内核数据流

内核从始至终处理一组数据耗时越长,使用主机到内核数据流来提升性能的可能性就越大。因为这样无需等待至内核完成处理一组数据,只需等待至内核准备好开始处理下一组数据即可。这样即可实现时间并行化,即同一内核的不同阶段以流水打拍方式处理来自多个 clEnqueueTask 命令的不同数据组。

对于高级设计,您可将空间并行化(通过多个 CU 处理数据)与时间并行化(使用主机到内核数据流)有机结合,从而在每个计算单元上重叠内核执行。

重要: 嵌入式处理器平台不支持主机到内核数据流功能。