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

如何理解两个_m256i变量的AVX加法?代码输出异常求解

AVX _mm256_add_epi32 结果不符合预期的问题分析

你的代码里有两个关键错误导致结果异常:

1. SIMD向量初始化方式错误

__m256i是AVX的256位SIMD类型,不能直接用普通数组的大括号语法{1,2,3,4,5,6,7,8}初始化。这种写法会被编译器当作64位整数数组处理——__m256i占32字节,刚好是4个64位整数,大括号里的前4个值会被填充为64位元素,剩下的5、6、7、8会被忽略。当你用int32_t*指针读取时,每个64位元素会被拆成两个32位值,自然会出现你看到的奇怪数值。

必须用AVX提供的专用初始化函数:

  • _mm256_setr_epi32(a0,a1,a2,a3,a4,a5,a6,a7):按参数顺序填充8个32位整数到向量中
  • _mm256_set_epi32(a7,a6,a5,a4,a3,a2,a1,a0):按参数逆序填充(最后一个参数对应向量第一个元素)

2. 输出时读取了错误的向量

你代码里把vec1的地址强转为int32_t*来输出,完全没用到加法运算后的result向量,等于白执行了加法操作。


修正后的代码

#include <immintrin.h>
#include <iostream>

__m256i foo();
__m256i foo2();

int main() {
    __m256i vec1 = foo();
    __m256i vec2 = foo2();

    __m256i result = _mm256_add_epi32(vec1, vec2);

    // 读取计算后的result向量,而非vec1
    int32_t* res = reinterpret_cast<int32_t*>(&result);
    for (int i = 0; i < 8; ++i) {
        std::cout << res[i] << std::endl;
    }

    system("pause");
    return 0;
}

__m256i foo() {
    // 使用_mm256_setr_epi32按顺序初始化8个32位整数
    return _mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 8);
}

__m256i foo2() {
    return _mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 8);
}

运行这段代码就能得到你预期的2、4、6、8、10、12、14、16结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:37:22