问题描述
我有以下 __ m128
个向量:
v_weight
v_entropy
仅当 v_weight
中的元素不为0f时,我才需要向 v_weight
中添加 v_entropy
.
I need to add v_entropy
to v_weight
only where elements in v_weight
are not 0f.
很显然, _mm_add_ps()
会添加所有元素.
Obviously _mm_add_ps()
adds all elements regardless.
我最多可以编译AVX,但不能编译AVX2.
I can compile up to AVX, but not AVX2.
编辑
我确实知道 v_weight
中有多少个元素将为0(总为0或最后的1、2或3个元素).如果更简单,如何将 v_entropy
中的相应元素归零?
I do know beforehand how many elements in v_weight
will be 0 (there will always be either 0 or the last 1, 2, or 3 elements). If it's easier, how do I zero-out the corresponding elements in v_entropy
?
推荐答案
cmpeq/cmpgt指令创建一个全为1或全为零的掩码.整个过程如下:
The cmpeq/cmpgt instructions create a mask, all ones or all zeros. The overall process goes as follows:
auto mask=_mm_cmpeq_ps(_mm_setzero_ps(), w);
mask=_mm_andnot_ps(mask, entropy);
w = _mm_add_ps(w, mask);
其他选项仍然是累加,但可以使用blendv在已添加/未添加之间进行选择.
Other option is to accumulate anyway, but use blendv to select between added/not added.
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
Third option uses the fact that w+e = 0, when w=0
m=(w==0); // make mask as in above
w+=e; // add
w&=~m; // revert adding for w==0
(我正在使用cmpeq而不是cmpneq来使它也可用于整数.)
(I'm using cmpeq instead of cmpneq to make it usable for integers as well.)
这篇关于基于比较的条件SSE/AVX加或零元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!