如何将 8 个打包的 32 位整数(在 __m256i 中)的 +-1 符号打包成 64 位整数的字节?

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

给定

__m256i
的打包 32 位有符号整数,如果原始
1
中相应的 32 位有符号整数大于或等于,如何获取每个字节为
__m256i
的单个 64 位数字到 0,如果该 32 位整数为负数,则得到
-1

AVX2(可能还有 AVX512)很有趣。

c++ performance simd intrinsics avx2
1个回答
0
投票

您可以将结果转换为 +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。

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