6

这是针对熟悉 SSE/AVX 指令家族的用户以及熟悉其性能分析的用户提出的问题。我看到了很多不同的实现和方法,从旧的 SSE2到新的。网络上充斥着这样的链接。但就我个人而言,我在 sse 汇编分析方面经验并不丰富。有些人指出了微指令、缓存,这需要一些低级知识。所以我要求一个提示和你的个人经历。如果您有时间进行一些比较,关于“什么是最快的”以及为什么,您查看了哪些方法。实现可能不是那么精确,10-16 位的单 FP 精度就足够了。越多越好,但当它不影响速度时。

PS。为了避免元洪水,我可以用细节精确地描述任务:

  • 给定标量参数 x(以弧度为单位),它在 xmm 寄存器中传递(根据 x64 快速调用约定)。
  • 写一个带有签名的函数__m128 sincos(float x);返回其 sin(x) 和 cos(x) 值的近似值。
  • 返回值应在一个 xmm 寄存器内,并以尽可能快的方式计算,以满足 10 位精度要求。
  • 参数可以是任何数(但不是nan, inf, 等等)。如果方法需要参数规范化,则其高性能实现(fmod())也是主题。但问题不在于处理特殊的 FP 案件。

这可能是重复的,但我没有在这里找到类似的问题,所以请指出我,如果已经有一个。

4

1 回答 1

4

感谢 Giovanni Garberoglio,我发现了Julien Pommier 实现的伟大现代版本,移植到 zlib 下的 AVX/AVX2:

http://software-lisc.fbk.eu/avx_mathfun/

它的运行速度非常快,在 i7 3770k 的单核上每秒进行 80-90M 次迭代,每次迭代提供 8 个正弦和 8 个余弦。与 ~15Mhz 相比,如果我每次迭代调用 8 个 sinf() 和 8 个 cosf() (来自 msvc2017 x64 库的函数,具有 avx 编译器设置)


UPD: 还有一个优秀的FastTrigo代码示例,其中FT::sincos()函数比 Julien Pommier 的实现快 20%。而且他FT::sincos()提供了准确的 10 位保证准确性。

于 2018-02-26T12:02:51.443 回答