Intel® FPGA SDK for OpenCL™ Pro Edition: 最佳实践实践指南

ID 683521
日期 9/26/2022
Public
文档目录

4.3. 优化浮点操作

对于浮点操作,您可以手动指示 Intel® FPGA SDK for OpenCL™ Offline Compiler执行优化, 在硬件中创建更多有效的流水线结构并减少整体硬件使用。 这些优化可能会导致浮点结果的微小差异。
提示: 对于oneAPI DPC++的具体细节,请参阅 Intel® oneAPI Toolkits的FPGA优化指南中的优化浮点操作主题。

树平衡

操作规则的顺序适用于OpenCL™语言。在以下实例中,离线编译器以严格顺序执行乘法和加法,从最里面的括号开始:

结果= (((A * B) + C) + (D * E)) + (F * G);

默认情况下,离线编译器会针对此类计算创建一个类似于长藤(long vine)的实现:

图 69. 默认浮点实现


长时间,不平衡的操作会导致更昂贵的硬件。然而更高效的硬件实现是balanced tree(平衡树),如下图所示:

图 70. 平衡多路查找树浮点实现


在B树实现中,离线编译器将浮点加法器的长藤(long vine)转换为树型流水线结构。离线编译器不会自动执行浮点运算的树型平,因为浮点运算的结果可能有所不同。因此,该优化不符合IEEE Standard 754-2008。

如果您希望离线编译器使用B树优化浮点运算,并且您的程序可以容忍浮点结果的微小差异,就请在aoc命令中包含-fp-relaxed选项,如下所示:

aoc -fp-relaxed <your_kernel_filename>.cl

舍入运算(Rounding Operations)

浮点运算的B树实现包含多个舍入运算。在某些应用程序中,这些舍入运算可能需要大量硬件资源。离线编译器不会自动减少舍入运算的数量,因为这样做就违反了IEEE Standard 754-2008要求的结果。

您可以通过aoc命令的-fpc选项来减少实现浮点运算所需的硬件数量。如果您的程序可以容忍浮点结果中的微小差异,则请调用以下命令:

aoc -fpc <your_kernel_filename>.cl

-fpc选项指示离线编译器执行以下任务:

  • 尽可能删除浮点舍入运算和转换。

    如果可能,-fpc自变量指示离线编译器只在浮点运算树的末尾对浮点运算舍入一次。

  • 携带其它尾数位以保持精确度。

    离线编译器携带浮点运算的其它精确位,并且在浮点预算树的末尾删除这些精确位。

这种类型的优化会导致硬件执行融合floating-point operation(浮点运算),这是许多新的硬件处理系统的特性。融合多个浮点运算最大程度减少舍入步骤的数量,从而获得更准确的结果。这种优化的实例是新处理器架构中可用的融合乘法累加(FMAC)指令。离线编译器可以为内核中浮点运算的许多组合提供融合的浮点数学功能。