SIMD,SSE,AVX-掩码8由未签名的字符浮起来?

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

如何通过__m256变量中的位屏蔽unsigned char变量中的8个浮点数? (它们的值在编译期间未知)

__m256 flts = _mm256_set1_ps(5.0f);
unsigned char = 0b10010111;//just for example, but can be any value during runtime

所需的输出将使flts包含5、0、0、5、0、5、5、5

Intel Intrinsics Guide上有有效的说明吗?

处理器仅支持最高AVX的指令(但不支持AVX2或更高版本)

c++ sse intrinsics avx
1个回答
1
投票

如果您有AVX512F和AVX512VL,则可以使用此:

auto input    = _mm256_set1_ps(5.0f);
__mmask8 mask = 0b10101010;
auto masked   = _mm256_maskz_mov_ps(mask,input);

否则,当您首先必须找到一种方法将8位“解包”为__m256的8个32位字段时,必须使用按位的方式>

static constexpr int32_t all_mask=int(0xffffffff);
audo tmp      = _mm256_setr_epi32(mask&1 ? all_mask:0, mask&2  ? all_mask:0,
                                  mask&4 ? all_mask:0, mask&8  ? all_mask:0,
                                  mask&16? all_mask:0, mask&32 ? all_mask:0,
                                  mask&64? all_mask:0, mask&128? all_mask:0);
auto masked   = _mm256_and_ps(tmp,input);

((我可能混淆了_mm256_setr_epi32_mm256_set_epi32。)大概有一种打开口罩包装的更快方法,请参阅this answer

换句话说,在这种情况下,最好不要使用8位整数问掩码,而直接使用__m256__m256i

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