HLS 数学库精度 - 2022.1 Chinese

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

Document ID
UG1399
Release Date
2022-06-07
Version
2022.1 简体中文

HLS 数学函数由 hls_math.h 库实现为可综合的位近似函数。位近似 HLS 数学库函数无法提供与标准 C 语言函数相同的精度。为了获得期望的结果,位近似的实现可能使用与标准 C 语言数学库版本不同的底层算法。该函数的精度以 ULP(最小精度单位)的形式指定。精度上的差异对 C 语言仿真和 C/RTL 协同仿真都有影响。

ULP 差异通常在 1-4 ULP 范围内。

  • 如果在 C 语言源代码中使用标准 C 语言数学库,则由于某些函数与标准 C 语言数学库表现出 ULP 差异,因此 C 语言仿真与 C/RTL 协同仿真之间可能会有差异。
  • 如果在 C 语言源代码中使用 HLS 数学库,则 C 语言仿真与 C/RTL 协同仿真之间不会有任何差异。但是,使用 HLS 数学库的 C 语言仿真可能与使用标准 C 语言数学库的 C 语言仿真之间存在差异。

此外,以下 7 个函数可能会显示出一些差异,具体取决于用于编译和运行 C 语言仿真的 C 语言标准:

  • copysign
  • fpclassify
  • isinf
  • isfinite
  • isnan
  • isnormal
  • signbit

C90 模式

系统通常仅提供 isinfisnancopysign,并且这些函数仅适用双精度类型。特别是,copysign 始终返回双精度结果。如果必须返回浮点数,则在综合后可能会导致意外结果,这是因为在硬件中引入了双精度至浮点数转换块。

C99 模式 (-std=c99)

在此模式下通常系统可提供全部 7 个函数,并且期望系统头文件会将其重定向到 __isnan(double)__isnan(float)。常用的 GCC 头文件不会重定向 isnormal,而是根据 fpclassify 来将其实现。

使用 math.h 的 C++

系统可提供全部 7 个函数,并且这些函数都适用于双精度类型。

copysign 始终返回双精度结果。如果必须返回浮点数,则在综合后可能会导致意外结果,这是因为在硬件中引入了双精度至浮点数转换块。

使用 cmath 的 C++

与 C99 mode(-std=c99) 类似,以下情况除外:

  • 系统头文件通常不同。
  • 这些函数可正确重载,以用于:
    • float(). snan(double)
    • isinf(double)

copysigncopysignf 作为内置函数来处理,即使使用 namespace std; 时也是如此。

使用 cmath 和名称空间 std 的C++

没有任何问题。赛灵思建议使用以下方法以获得最佳效果:

  • 对于 C,使用 -std=c99
  • 对于 C 和 C++,使用 -fno-builtin
注释: 要指定 -std=c99 等 C 语言编译选项,请使用 Tcl 命令 add_files 搭配 -cflags 选项。还可以在“Project Settings”(工程设置)对话框中使用Edit CFLAGs按钮。