这是代码:
#include <immintrin.h>
#include <stdio.h>
#include <memory>
#include <iostream>
__m256i foo();
__m256i foo2();
int main() {
__m256i vec1 = foo();
__m256i vec2 = foo2();
__m256i result = _mm256_add_epi32(vec1, vec2);
/* Display the elements of the result vector */
int32_t* res = (int32_t*)&vec1;
std::cout << res[0] << std::endl;
std::cout << res[1] << std::endl;
std::cout << res[2] << std::endl;
std::cout << res[3] << std::endl;
std::cout << res[4] << std::endl;
std::cout << res[5] << std::endl;
std::cout << res[6] << std::endl;
std::cout << res[7] << std::endl;
system("pause");
return 0;
}
__m256i foo() {
__m256i v = { 1, 2, 3, 4, 5, 6, 7,8 };
return v;
}
__m256i foo2() {
__m256i w = { 1, 2, 3, 4, 5, 6, 7,8 };
return w;
}
我在互联网上进行了深入研究,试图了解 AVX 的工作原理,但仍然没有完全理解。上面的代码不应该显示这个吗:
2、4、6、8、10、12、14、18?因为我要将两个八个单位的向量加在一起?
运行时我在控制台中得到的输出是这样的:
67305985 134678021 0 0 0 0 0 0
怎么会这样?我是一名经验丰富的 C# 程序员,现在正在尝试学习 C++。预先感谢您的任何回复/解释!
为了初始化
__m256i
寄存器,您应该使用正确的函数。
要使用 32 位值进行初始化,您应该使用 _mm256_set_epi32
。
请注意,您传递给 _mm256_set_epi32
的值的顺序应与您预期的相反。
因此您的
foo
和 foo2
应该是:
__m256i foo() {
__m256i v = _mm256_set_epi32(8, 7, 6, 5, 4, 3, 2, 1);
return v;
}
__m256i foo2() {
__m256i w = _mm256_set_epi32(8, 7, 6, 5, 4, 3, 2, 1);
return w;
}
代码中的另一个问题可能是拼写错误 - 您从
int32_t* res
而不是从 vec1
初始化 result
。