我有以下__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
中的相应元素归零?
答案 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使其也可用于整数。)