给定
__m256i
的打包 32 位有符号整数,如果原始 1
中相应的 32 位有符号整数大于或等于,如何获取每个字节为 __m256i
的单个 64 位数字到 0,如果该 32 位整数为负数,则得到 -1
?
AVX2(可能还有 AVX512)很有趣。
您可以将结果转换为 +1 / -1 作为
__m256i
向量,然后用一系列包对其进行压缩。
第一步可以这样完成,知道
float
和int32_t
的符号在同一个位置:
__m256i plus_or_minus_pi32 = _mm256_castps_si256(_mm256_blendv_ps(
_mm256_castsi256_ps(_mm256_set1_epi32(+1)),
_mm256_castsi256_ps(_mm256_set1_epi32(-1))
_mm256_castsi256_ps(val)));
然后
_mm256_packs_epi32
后面跟着 _mm256_packs_epi16
就可以将其压缩为 int8_t
向量。
最后,如果需要,可以通过
_mm256_extract_epi64
零参数转换为 GRP。