Intel® 高层次综合编译器专业版Pro版: 参考手册

ID 683349
日期 12/04/2023
Public
文档目录

13.8. Intel® HLS Compiler Pro版范围预处理指令

使用 Intel® HLS Compiler范围指令会影响组件中浮点运算的舍入和算术运算的排序,并且其使用的粒度比i++命令选项更细。

表 44.   Intel® HLS Compiler Pro版范围预处理指令总结
预处理指令 描述
fp contract 控制在应用此指令的代码块内尽可能删除中间舍入和转换。
fp reassociate 控制在应用此指令的代码块内浮点算术运算顺序的松弛度。

fp contract作用域指令

句法
#pragma clang fp contract(state)
描述
对于双精度数据类型,此指令控制编译器是否可以将浮点乘法和加法或减法运算收缩为单个融合乘加(FMA),并控制编译器是否跳过中间舍入和转换。

此指令对涉及单精度数据类型的操作没有影响。

如果此指令多次出现且影响同一范围,则范围最窄的指令优先。

state参数可以是下列值之一:
  • off

    关闭将指令融合到FMA中的任何权限。

    -ffp-contract=fast i++命令标记对于预处理指令范围内指令的效力被抑制。

  • on

    仅当multadd指令位于同一代码行时,才能将他们融合到FMA中,但可能会违反语言标准。

    对于此预处理指令范围内的指令,启用与-ffp-contract=on i++命令标志相同的优化。

    -ffp-contract=fast i++命令标志的效力被预处理指令范围内的指令覆盖。即,仅当#pragma clang fp contract(on)代码范围内的操作在同一行代码中时才可以融合,在多行代码中时无法融合。

  • fast

    允许将multadd指令跨多行代码融合到FMA中,但可能会违反语言标准。

    对于此预处理指令范围内的指令,已启用与-ffp-contract=fast i++命令标志相同的优化。

例如,在如下代码中, #pragma clang fp contract(on)#pragma clang fp contract(fast)会有同样的效果:
double res = a * b + c;
但是,如下代码中,#pragma clang fp contract(on)#pragma clang fp contract(fast)会有不同的效果:
double temp = a * b;
double res = temp + c;

fp reassociate作用域指令

句法
#pragma clang fp reassociate(state)
描述
此指令控制编译器是否可以放宽源代码要求的浮点运算顺序。通过重新排序,编译器可以优化硬件结构,从而提高组件的性能。

如果此指令多次出现且影响同一范围,则范围最窄的指令优先。

state参数可以是下列值之一:
  • on

    对预处理指令范围内的指令启用-ffp-reassociate i++命令标志的效果。

  • off

    会消除-ffp-reassociate i++命令标志对预处理指令范围内指令的影响。