将 SIMD 寄存器中的 64 位整数解释为 32 位整数的问题

Issue of interpreting 64-bit to 32-bit integer in SIMD register

我对上面的解释问题很困惑。我使用这样的内在函数设置了一个具有 4 * 64 位整数值 2^32 的 256 位向量寄存器:

    __m256i vec_mask = _mm256_set1_epi64x(1 << 32);

那么我想将它解释为 8 * 32 位整数:

    __m256i * tmp_mask = new __m256i;
    _mm256_storeu_si256(tmp_mask, vec_mask); // store
    for (int i = 0; i < 8; ++i)
        printf("%d ", ((int *)(tmp_mask))[i]);
    delete tmp_mask;

至于每个64位的值2^32,我想在SIMD寄存器中是这样的:

00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

255 (MSB) ----------------------------------------------------- 0 (LSB)

因此每个 64 位值 2^32 被解释为 2 * 32 位格式的 <1, 0>。最终的输出预计从低到高是<0, 1, 0, 1, 0, 1, 0, 1>,但是输出的却相当诡异:<0, 0, 0, 0, 0, 0, 0, 0>

知道我哪里出错了吗?谢谢。

下面的代码输出 0 1 0 1 0 1 0 1 如你所料...

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <x86intrin.h>

int main() {
     __m256i vec_mask = _mm256_set1_epi64x(UINT64_C(1) << 32);
    uint32_t tmp_mask[8];
    _mm256_storeu_si256((__m256i *)tmp_mask, vec_mask); // store
    for (int i = 0; i < 8; ++i)
        printf("%d ", tmp_mask[i]);
}