我一直在寻找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()

10-08 08:47