You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用SSE2 _mm_cmpeq_pd这类浮点比较指令比较64位整数?

浮点比较指令能否用于64位整数比较的解答

核心结论

SSE2 _mm_cmpeq_pd、AVX _mm_cmp_pd这类浮点比较指令,绝对不能直接用来模拟64位整数相等比较_mm_cmpeq_epi64,原因如下:

  • 浮点相等比较不是按位比对,存在两类不符合整数比较规则的特殊处理:
    1. NaN值判定规则:只要任意一个操作数是NaN,无论两个NaN的二进制表示是否完全一致,浮点比较都会返回「不相等」
    2. 正负零判定规则:+0和-0的二进制表示完全不同,但浮点比较会判定二者相等,这对64位整数来说属于两个完全不同的数值

_mm_cmpeq_epi64的正确模拟方案

如果目标环境不支持SSE4.1(SSE4.1及以上指令集已原生提供_mm_cmpeq_epi64),可以通过拆分高低32位整数比较的方式实现,性能几乎无损失,且完全符合整数比较规则:

// SSE2环境下模拟_mm_cmpeq_epi64的实现
__m128i mm_cmpeq_epi64_sse2(__m128i a, __m128i b)
{
    // 先逐32位比较是否相等
    __m128i cmp_32 = _mm_cmpeq_epi32(a, b);
    // 交换每个64位元素的高低32位比较结果
    __m128i shuffle_cmp = _mm_shuffle_epi32(cmp_32, _MM_SHUFFLE(2, 3, 0, 1));
    // 高低32位同时相等时,对应64位元素的所有位才会被置为全1
    return _mm_and_si128(cmp_32, shuffle_cmp);
}

内容的提问来源于stack exchange,提问作者Alex Guteniev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:36:07