如何理解这个AVX添加两个_m256i变量?

问题描述 投票:0回答:1

这是代码:

#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++。预先感谢您的任何回复/解释!

c++ vector avx avx2 avx512
1个回答
0
投票

为了初始化

__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

© www.soinside.com 2019 - 2024. All rights reserved.