首页 > 解决方案 > SIMD (AVX):如何通过运行时计算的掩码“混合”浮点数?

问题描述

如何使用 AVX 内在函数有条件地保持`相等的浮点数?

我有

__m256 valA = .....;
__m256 valB = .....;

__m256 aIsB = _mm256_cmp_ps( valA, valB, _CMP_EQ_OS );

得到这样的面具后,我打算使用

__m256 zeros = _mm256_set1_ps(0.0f)
__m256 same = _mm256_blend_ps(valA, zeros, aIsB);//<--aIsB must actually be imm8

但是_mm256_blend_ps需要掩码作为运行时编译常量。否则我会以某种方式需要__m256投入imm8

我应该使用其他功能吗?

文档:

_mm256_blend_ps

_mm256_cpm_ps

“AVX 比较”谓词变体

标签: ssesimdavx

解决方案


您正在寻找的指令是blendvps,但如果您想在每个不满足比较的条目处为零,您可以简单地使用andps.

__m256 aIsB = _mm256_cmp_ps( valA, valB, _CMP_EQ_OS );
__m256 same = _mm256_and_ps( valA, aIsB);

推荐阅读