c++中倒数计算的性能

performance of reciprocal calculation in c++

有什么方法可以在不损失精度的情况下提高计算性能?目前我只是在做:

1 / (1 + a * b)

其中 ab 是双倍的。 a 的值是常数。我需要做数百万次这样的计算。

a == 0,a != 0,

我们分开吧
  • 如果a == 0,则答案是1(crystal清楚)
  • 如果a ==!0,让c = 1/a

(c也是常量)那么整个表达式就变成了

    c / (b + c)

这将节省一次乘法计算。

看来您必须迭代计算给定的表达式(数百万次)。至于你有迭代过程——你可以考虑并行。在给定的情况下,我会考虑 SIMD(向量)并行性。

现代 x86 处理器具有各种指令的 SIMD 并行变体,用于 "packed"(即 SIMD 并行)分区 和 "packed"(SIMD 并行)倒数 具有不同的精度。

这意味着如果你有能力"vectorize"你的迭代算法(使用现代编译器,pragmas OpenMP4.x等)和运行 在具有 AVX 支持的现代 x86 硬件上生成的应用程序(Sandy Bridge 或更高版本,即 2011 年后发布),那么编译器很可能会使用高效且快速的矢量 parallel 除法或倒数(或 newton-rhapson 方案)取决于您选择的浮点精度编译选项。在某些平台上,压缩(并行)除法与标量(顺序)除法一样快,同时一次处理 4-16 个以上的元素。反过来,倒数比分部快得多。

这里是打包的 AVX 和 AVX512 division/reciprocal 指令的列表,给你一些想法(RCP 代表 Reciprocal。PS 代表并行单精度浮点数,PD代表并行 double-precision FP,DIV 代表分区。AVX - 是你的 CPU 从 ~2011 开始支持的。AVX-512 是一些 "CPUs" 开始支持的从 2016 年下半年开始)

  • ISA |说明 |准确性
  • AVX | VRCPS(无 DP)| 2^-12
  • AVX、AVX2 | VDIVPD/PS
  • AVX-512F | VRCP14PD/PS | 2^-14
  • AVX-512F | VDIVPD/PS | 53 位??
  • AVX-512ER| VRCP28PD/PS | 2^ -28?