我一直在寻找SIMD选项来加快比较速度,发现功能__m128d _mm_cmpgt_sd (__m128d a, __m128d b)
显然,它比较较低的双精度值,并将较高的双精度值从a
复制到输出中。它在做什么很有意义,但是有什么意义呢?这想解决什么问题?
最佳答案
关键可能是在非常旧的硬件上,例如Intel Pentium II和III,_mm_cmpgt_sd()
比_mm_cmpgt_pd()
快。参见Agner Fog的instruction tables。这些处理器(PII和PIII)仅具有64位宽的浮点单元。在这些处理器上,128位宽的SSE指令作为两个64位微操作执行。在更新的CPU(例如intel Core 2(Merom)和更新的CPU)上,_pd
和_ps
版本与_sd
和_ss
版本一样快。因此,如果您只需要比较单个元素并且不关心结果的高64位,则可能更喜欢_sd
和_ss
版本。
此外,如果高位垃圾位偶然包含_mm_cmpgt_pd()
或次普通数,则NaN
可能会引发虚假浮点异常或性能下降。请参见Peter Cordes’ answer。尽管在实践中,使用内在函数进行编程时应该很容易避免此类高位垃圾位。
如果要向量化代码,并且需要进行打包双重比较,请使用固有的_mm_cmpgt_pd()
而不是_mm_cmpgt_sd()
。