这是一个熟悉SSE/AVX指令系列的用户以及熟悉其性能分析的用户所面临的一个问题。我看到了很多不同的实现和方法,从older for SSE2到较新的实现。网络充斥着这样的链接。但是我个人在sse组装分析方面没有丰富的经验。有些人指出了微指令,缓存,这需要一些低级的知识。因此,我要求您提供一些提示和您的个人经历。如果您有时间展开一些比较,那么您将了解“什么是最快的”以及为什么选择了什么方法。实现可能不是那么精确,单个FP精度的10-16位就足够了。越多越好,但是当它不影响速度时。

PS。为了避免元数据泛滥,我可以精确地描述任务:

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


  • 这可能是重复的,但是我在这里找不到类似的问题,因此,如果已经存在,请指出。

    最佳答案

    由于乔瓦尼·加贝罗格里奥(Giovanni Garberoglio),我发现了ozt_a的绝佳现代修订版,可在zlib下移植到AVX/AVX2:

    Julien Pommier implementations

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

    UPD:
    还有一个出色的http://software-lisc.fbk.eu/avx_mathfun/代码示例,其中FT::sincos()函数比Julien Pommier的实现快20%。并且他的FT::sincos()提供了准确的10位保证精度。

    关于performance - 如何在x64 CPU上快速计算sincos?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48971804/

    10-11 02:16
    查看更多