HLS 抽象并行编程模型 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

为了实现高性能硬件,HLS 工具必须基于顺序代码推断并行度,并利用它来实现更高的性能。要解决这个问题可并不简单。此外,优秀的软件设计通常使用精心定义的规则和实践,例如,运行时类型信息 (RTTI)、递归和动态存储器分配。其中诸多技巧在硬件中都无法找到直接等效的对象,故而给 HLS 工具带来了诸多挑战。这通常意味着现成软件无法高效转换为硬件。最低限度,需检验此类软件中是否存在不可综合的构造,并需要重构代码,使其可综合。即使软件程序可自动转换(或综合)为硬件,但您需要了解编写在 FPGA 器件上执行的优秀软件的最佳实践,从而辅助该工具完成工作。

设计原则 章节介绍了三个主要范例,要为 FPGA 平台编写优秀软件,就需要了解这三个范例:生产者使用者、串流数据和流水打拍。这些范例的底层并行编程模型如下所述:

  • 设计/程序需作为任务集合来构造,这些任务通过通信链接(也称为通道)来彼此发送消息
  • 任务可按控制驱动的方式来构造,使用此方式时,任务会等待某些信号后才开始执行;或者任务也可按数据驱动的方式来驱动,在此情况下,通道上只要存在数据,就会驱动任务执行
  • 任务由可执行单元组成,此类单元具有本地存储空间/存储器以及输入/输出 (I/O) 端口集合。
  • 本地存储器包含专用数据,例如,任务享有专属访问权的数据
  • 对此专用存储器执行的访问称为本地数据访问,类似块 RAM/URAM 中存储的数据。此类访问十分快速。任务将其本地数据副本发送到其他任务的唯一方式是通过其输出端口,反之,它只能通过其输入端口来接收数据
  • I/O 端口是抽象端口;它对应于任务用于发送或接收数据的通道,并且它由模块的调用程序连接,或者如果它是顶层端口,则在系统集成时连接
  • 通过通道发送或接收的数据称为非本地数据访问。通道是将某一个任务的输出端口连接到另一个任务的输入端口的数据队列
  • 通道应确保可靠,并具有如下行为:
    • 在生产者输出处写入数据的顺序与在使用者输入端口处读取数据的顺序相同以便于 FIFO。对于 PIPO,可按随机顺序写入/读取数据
    • 不丢失任何数据值
  • 针对通道,支持阻塞和非阻塞读写语义仿真,如 HLS 串流库 中所述
图 1. 阻塞/非阻塞语义

在该模型中使用阻塞语义时,读取空通道会导致读取进程发生阻塞。同样,写入已满的通道则会导致写入进程发生阻塞。生成的进程/通道网络会展现出确定性行为,此类行为不依赖于计算的时序或通信延迟。这些样式的模型经验证,非常便于用于对嵌入式系统高性能计算系统、信号处理系统、串流处理系统、数据流编程语言及其他计算任务进行建模。

建模的阻塞样式可能导致因下列原因而发生死锁:通道队列大小不足(前提是通道为 FIFO)和/或由于生产者与使用者之间的产率不同。如果在该模型中使用非阻塞语义,那么读取空通道就会导致读取未初始化的数据,或者导致重新读取上一个数据项。同样,写入已满的队列则会导致数据丢失。为避免此类数据丢失,设计必须首先检查队列状态,然后才能执行读写。但这会导致此类模型的仿真呈现不确定性,因为它所依赖的决策是根据通道的运行时状态来作出的。这会导致对此模型的结果进行验证变得极为困难。

Vitis HLS 抽象并行编程模型支持阻塞语义和非阻塞语义。