Jim*_*mbo 3 x86 sse simd intrinsics
我正在寻找一个 SIMD 选项来加速比较,我找到了这个功能 __m128d _mm_cmpgt_sd (__m128d a, __m128d b)
显然它比较了较低的双精度,并将较高的双精度复制a到输出中。它在做什么是有道理的,但有什么意义呢?这试图解决什么问题?
关键可能是在非常旧的硬件上,例如 Intel Pentium II 和 III,_mm_cmpgt_sd()比_mm_cmpgt_pd(). 请参阅 Agner Fog 的说明表。这些处理器(PII 和 PIII)只有一个 64 位宽的浮点单元。128 位宽 SSE 指令在这些处理器上作为两个 64 位微操作执行。在较新的的CPU(例如英特尔核心2(的Merom)和更新的版本)的_pd和_ps版本是一样快_sd和_ss版本。因此,如果您只需要比较单个元素并且不关心结果的高 64 位,您可能更喜欢_sd和_ss版本。
此外,_mm_cmpgt_pd()如果高位垃圾位意外包含 aNaN或次正规数,则可能会引发虚假浮点异常或性能下降,请参阅Peter Cordes 的回答。尽管在实践中,使用内在函数进行编程时应该很容易避免这样的高位垃圾位。
如果你想对你的代码进行矢量化,并且需要一个压缩的双比较,那么使用内在的_mm_cmpgt_pd(),而不是_mm_cmpgt_sd().