如何在x64 CPU上快速计算sincos?

xak*_*p35 5 performance trigonometry sse avx function-approximation

这是一个在SSE/AVX指令系列中经验丰富的用户,以及熟悉其性能分析的人员.我看到了很多不同的实现和方法,从较旧的SSE2到新的.网络充斥着这样的链接.但就我个人而言,我对sse装配分析并不十分经验.有些人指出了uops,缓存,这需要一些低级知识.所以我要求提示和你的个人经历.如果你有时间推出一些比较,在"什么是最快的"以及为什么,你看到了什么方法.实现可能不那么精确,单个FP精度的10-16位就足够了.越多越好,但是当它不影响速度时.

PS.为了避免元洪水,我可以准确地描述任务的细节:

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

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

xak*_*p35 4

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

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 位。