我对上述解释问题感到困惑。我使用这样的内在函数设置了一个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>
。
知道我弄错了吗?感谢。
答案 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]);
}