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

如何用AVX2实现8位无符号整数SIMD比较并生成±1/0结果?

AVX2实现8位无符号整数的三态比较(+1/0/-1)

AVX2高效实现方案

针对256位AVX2寄存器中打包的32个8位无符号整数,可通过无分支向量指令序列生成目标结果:

核心思路

利用AVX2的无符号比较指令生成掩码,再将掩码转换为对应符号值后相加:

  • 生成a > b的掩码:每个元素为0xFF(真)或0x00(假)
  • 生成a < b的掩码:等价于b > a的掩码,同样是0xFF/0x00
  • 将a > b的掩码与0x01相与,得到+1或0
  • 上述结果与a < b的掩码直接相加——0xFF作为8位有符号整数正好是-1,相加后自然得到+1(a>b)、0(a=b)、-1(a<b)

代码实现

#include <immintrin.h>

__m256i cmp_epu8_sign(__m256i a, __m256i b) {
    // 生成a > b的掩码
    __m256i gt_mask = _mm256_cmpgt_epu8(a, b);
    // 生成a < b的掩码(等价于b > a)
    __m256i lt_mask = _mm256_cmpgt_epu8(b, a);
    // 将gt掩码转换为+1或0
    __m256i gt_val = _mm256_and_si256(gt_mask, _mm256_set1_epi8(1));
    // 相加得到最终结果
    return _mm256_add_epi8(gt_val, lt_mask);
}

效率说明

该方案仅使用4条运行时AVX2指令,完全无分支,能最大化向量执行效率,充分利用AVX2的256位带宽。

关于AVX512的说明

AVX512并未提供直接生成+1/0/-1比较结果的专用指令,但其掩码操作更灵活(如可直接使用k掩码寄存器进行条件赋值),核心实现逻辑与AVX2类似:通过比较生成掩码,再转换为目标符号值。由于你无法使用AVX512,上述AVX2方案是最优选择。

可选:返回实际有符号差值

若允许返回实际差值而非归一化的+1/0/-1,可将8位无符号整数扩展为16位有符号后相减:

__m256i sub_epu8_signed(__m256i a, __m256i b) {
    // 扩展为16位有符号整数
    __m256i a_ext = _mm256_cvtepu8_epi16(a);
    __m256i b_ext = _mm256_cvtepu8_epi16(b);
    // 计算有符号差值
    return _mm256_sub_epi16(a_ext, b_ext);
}

若需将差值归一化到+1/0/-1,可在此基础上使用_mm256_sign_epi16指令:

__m256i diff_to_sign(__m256i diff) {
    return _mm256_sign_epi16(_mm256_set1_epi16(1), diff);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:23:12