在SIMD寄存器中解释64位到32位整数的问题

时间:2017-01-29 12:56:21

标签: casting type-conversion simd endianness intrinsics

我对上述解释问题感到困惑。我使用这样的内在函数设置了一个256位向量寄存器,其中包含4 * 64位整数值2^32

    __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>

知道我弄错了吗?感谢。

1 个答案:

答案 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]);
}