我正在使用AVX2 x86 256位SIMD扩展。我想要做一个32位整数成分明智的if-then-else指令。在英特尔文档中,这样的指令称为vblend。howto vblend for 32-bit integer?或者:为什么没有_mm256_blendv_epi32?
英特尔内部指南包含函数_mm256_blendv_epi8。这个功能几乎可以满足我的需求。唯一的问题是它与8位整数一起工作。不幸的是,文档中没有_mm256_blendv_epi32。我的第一个问题是:为什么这个功能不存在?我的第二个问题是:如何模仿它?
经过一番搜索后,我发现_mm256_blendv_ps这做我想要的32位浮点。此外,我发现了投射函数_mm256_castsi256_ps和_mm256_castps_si256,它们从整数转换为32位浮点数并返回。将这些一起给出:
inline __m256i _mm256_blendv_epi32 (__m256i a, __m256i b, __m256i mask){
return _mm256_castps_si256(
_mm256_blendv_ps(
_mm256_castsi256_ps(a),
_mm256_castsi256_ps(b),
_mm256_castsi256_ps(mask)
)
);
}
虽然这看起来像5层的功能,它们中的4只美化了管型和一个直接映射到处理器的指令。因此整个功能归结为一个处理器指令。
因此,真正的尴尬部分是似乎有一个32位的blendv,除了相应的内在缺失。
是否有一些边界情况下会失败?例如,当整数位模式恰好表示浮点数NAN时会发生什么? blendv干脆忽略这一点,还是会提高一些信号?
如果这个工程:我是正确,有8位,32位和64位blendv但16位blendv缺什么?
你真的太过于复杂。只需将标志位复制到覆盖您的值的所有字节中,并使用_mm256_blendv_epi8'。如果你可以为你所有的32位整数生成一个0xffffffff的掩码,你已经拥有了你所需要的。 –
@Mark随机我的代码依赖于blendv只检查最高位。我有32个真/假值编码在一个向量中。我在blendv之前使用shift来选择值。但我同意,使用cmpxx内在函数之一的结果时,blendv_epi8会完成这项工作。 –
'blendvps'确实很安全,就像fp洗牌和移动一样。 – harold