如何理解两个_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
相关产品推荐
相关产品推荐

