条件SSE / AVX基于比较添加或零元素

时间:2018-04-23 13:35:31

标签: c sse intrinsics avx

我有以下__m128个向量:

v_weight

v_entropy

我需要将v_entropy添加到v_weight,仅v_weight中的元素不是0f。

显然_mm_add_ps()会添加所有元素。

我可以编译为AVX,但不能编译AVX2。

修改

我事先知道v_weight中有多少元素为0(总会有0或最后的1,2或3个元素)。如果更容易,我如何将v_entropy中的相应元素归零?

1 个答案:

答案 0 :(得分:3)

cmpeq / cmpgt指令创建一个掩码,全部为全部或全部为零。整个过程如下:

auto mask=_mm_cmpeq_ps(_mm_setzero_ps(), w);
mask=_mm_andnot_ps(mask, entropy);
w = _mm_add_ps(w, mask);

其他选项是积累,但使用blendv在添加/未添加之间进行选择。

auto w2=_mm_add_ps(e,w);
auto mask=_mm_cmpeq_ps(zero,w);
w=_mm_blendv_ps(w2,w, mask);

当w = 0

时,第三个选项使用w + e = 0的事实
 m=(w==0); // make mask as in above
 w+=e; // add
 w&=~m; // revert adding for w==0

(我使用cmpeq而不是cmpneq使其也可用于整数。)