条件 SSE/AVX 根据比较添加或归零元素

Conditional SSE/AVX add or zero elements based on compare

我有以下 __m128 个向量:

v_weight

v_entropy

我只需要在 v_weight 中的元素不是 0f 的情况下将 v_entropy 添加到 v_weight

显然 _mm_add_ps() 无论如何都会添加所有元素。

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

编辑

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

cmpeq/cmpgt 指令创建一个掩码,全 1 或全 0。整体流程如下:

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

其他的选择是无论如何都要累加,但是使用blendv来select之间added/not添加。

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

第三个选项使用 w+e = 0 的事实,当 w=0

 m=(w==0); // make mask as in above
 w+=e; // add
 w&=~m; // revert adding for w==0

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