给定一个__m256i
打包 32 位有符号整数的价值,如何获取每个字节所在的单个 64 位数字1
如果原始的相应 32 位有符号整数__m256i
大于或等于0,并得到-1
如果该 32 位整数是负数?
AVX2(可能还有 AVX512)很有趣。
这是另一种方法。
它需要 BMI2 支持 PDEP 指令,仅在 Intel 上快速,而 AMD 从 Zen 3 微架构开始。
// Convert sign bits of 8 int32 lanes into -1 / +1 bytes
uint64_t packSigns( __m256i vec )
{
// Bitcast to FP32 vector, compiles into no instructions
__m256 fv = _mm256_castsi256_ps( vec );
// Move sign bits to general-purpose register
uint64_t bits = (uint32_t)_mm256_movemask_ps( fv );
// Expand bits into bytes
constexpr uint64_t lowBits = 0x0101010101010101ull;
bits = _pdep_u64( bits, lowBits );
// Convert 0 / +1 bytes into +1 / -1 bytes
return ( bits * 0xFF ) | lowBits;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)