条件 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 以使其也可用于整数。)
我有以下 __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 以使其也可用于整数。)