使用SSE计算绝对值的最快方法

时间:2015-09-05 01:29:03

标签: x86 vectorization sse simd absolute-value

我知道3种方法,但据我所知,通常只使用前2种方法:

  1. 使用andpsandnotps屏蔽掉符号位。

    • 优点:如果掩码已经在寄存器中,则需要一条快速指令,这使得它非常适合在循环中多次执行此操作。
    • 缺点:掩码可能不在寄存器中或更糟糕,甚至不在缓存中,导致内存提取时间非常长。
  2. 将值从零减去否定,然后得到原始的最大值并否定。

    • 优点:固定成本,因为无需取件,就像面具一样。
    • 缺点:如果条件理想,将始终比掩码方法慢,我们必须等待subps完成才能使用maxps指令。
  3. 与选项2类似,将原始值从零减去否定,然后使用andps将结果“按位”和原始值相加。我运行了一个测试,将其与方法2进行比较,除了处理NaN时,它似乎与方法2的行为相同,在这种情况下,结果将与方法2的结果不同NaN

    • 优点:应该比方法2略快,因为andps通常比maxps快。
    • 缺点:当涉及NaN时,这会导致任何意外行为吗?也许不是,因为NaN仍然是NaN,即使它是NaN的不同值,对吧?
  4. 欢迎提出想法和意见。

0 个答案:

没有答案