将 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]);
}
我对上面的解释问题很困惑。我使用这样的内在函数设置了一个具有 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]);
}