在 Clang 中基于每个函数启用快速数学?

use*_*140 10 c++ clang++ c++17

fast-mathGCC 提供了一种使用 属性有选择地优化函数/代码段的方法 。有没有办法在 Clang 中使用 pragmas/attributes 启用相同的功能?我了解 Clang 提供了一些 编译指示 来指定浮点标志。然而,这些编译指示均未启用fast-math.

PS:之前有人问过类似的问题,但在 Clang 的上下文中没有得到回答。

Den*_*kiy 0

UPD:我错过了你提到的编译指示。据我所知,选项 1 是一个操作的快速数学运算。我不确定是否会冲洗次正常值,我希望它不会受到影响。

我没有找到每个函数的选项,但我确实找到了 2 个可以提供帮助的编译指示。

假设我们想要点积。

选项1。

float innerProductF32(const float* a, const float* b, std::size_t size) {
  float res = 0.f;

  for (std::size_t i = 0; i != size; ++i) {
#pragma float_control(precise, off)
    res += a[i] * b[i];
  }
  return res;
}
Run Code Online (Sandbox Code Playgroud)

选项2:

float innerProductF32(const float* a, const float* b, std::size_t size) {
  float res = 0.f;

  _Pragma("clang loop vectorize(enable) interleave(enable)")
  for (std::size_t i = 0; i != size; ++i) {
    res += a[i] * b[i];
  }
  return res;
}
Run Code Online (Sandbox Code Playgroud)

第二个功能较弱,它不生成fma指令,但也许这不是您想要的。