器件资源最优化 - 2022.1 简体中文

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

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

数据宽度

实现所需的数据宽度是性能最重要的方面之一。该工具在整个算法过程中会传输端口宽度。在某些情况下(尤其是以算法描述为起点时),C/C++/OpenCL 代码可能仅使用大型数据类型(如整数),即使在设计的端口处也是如此。但由于算法已映射到完全可配置的实现,因此有时 10 位或 12 位的小型数据类型可能就足够了。在最优化期间,最好检查“HLS Synthesis”(HLS 综合)报告中的基本运算大小。

总之,当 Vitis 核开发套件将算法映射到 FPGA 上时,需要进一步的处理才能理解 C/C++/OpenCL API 结构并提取运算之间的依赖关系。因此,为了执行此映射,Vitis 核开发套件通常会将源代码分区为不同运算单元,然后将其映射到 FPGA 上。通过该工具可以发现,这些运算单元 (ops) 的数量和大小受到多方面的影响。

下图报告了基本运算及其位宽。

图 1. 运算利用率估算结果

查找算法描述中常用的位宽(16 位、32 位和 64 位),并验证来自 C/C++/OpenCL API 源代码的关联运算确实需要这样大的位宽。这样可以显著改善算法实现,因为运算越小,所需的计算时间越短。

定点运算

某些应用仅使用浮点运算,因为这些应用是专为其它硬件架构而最优化的。针对深度学习之类的应用使用定点运算可以显著节省能耗和面积,同时保持精度等级不变。

宏运算

考虑更大的计算元素有时非常有利。该工具将在独立于其余的源代码的源代码上运行,有效地将算法映射到 FPGA 上,而无需考虑周围的运算。应用 Vitis 技术时,此技术可以保留运算边界,从而为特定代码有效创建宏运算。这使用了以下原理:

  • 映射进程的运算区域
  • 降低启发式方法的复杂性

应用此技术可能会产生巨大的不同结果。在 C/C++ 中,宏运算是借助 #pragma HLS inline off 的帮助来创建的。而在 OpenCL API 中,通过在定义函数时指定以下属性即可生成同样种类的宏运算:

__attribute__((always_inline))

如需了解更多信息,请参阅 pragma HLS inline

使用最优化的库

OpenCL 规范提供了许多内置数学函数。含 native_ 前缀的所有内置数学函数都映射到一条或多条本地器件指令,并且与不含 native_ 前缀的对应函数相比,通常性能更优。这些函数的精度和输入范围(某些情况下)由实现来定义。在 Vitis 技术中,这些 native_ 内置函数使用 Vitis HLS 工具的数学库中的等效函数,这些等效函数在面积和性能方面都已针对赛灵思 FPGA 经过了最优化。