如何通过__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或更高版本)
如果您有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
。