a3m*_*ord 8 c sse vectorization
我正在矢量化一段代码,在某些时候我有以下设置:
register m128 a = { 99,99,99,99,99,99,99,99 }
register m128 b = { 100,50,119,30,99,40,50,20 }
Run Code Online (Sandbox Code Playgroud)
我目前正在short这些寄存器中打包,这就是为什么每个寄存器有8个值.如果第i个值大于或等于(在这种情况下,用常数99填充),我想要做的是b用相应的值减去第i个元素.为此,我首先在和之间使用大于或等于的操作,这产生了这个例子:abaaba
register m128 c = { 1,0,1,0,1,0,0,0 }
Run Code Online (Sandbox Code Playgroud)
为了完成操作,我想使用乘法和减法,即存储在b操作中b -= a*c.结果将是:
b = { 1,50,20,30,0,40,50,20 }
Run Code Online (Sandbox Code Playgroud)
有没有做这种事的操作?我发现的是Haswell的融合操作,但我目前正在研究Sandy-Bridge.此外,如果有人有更好的想法这样做,请告诉我(例如我可以做一个逻辑减法:如果1 c然后我减去,否则没有.
您可以复制b到c,a从中减去c,在 16 位值中执行算术右移 15 个位置,对 的值求补c,c用掩码a,最后c从中减去b。
我对内在语法不熟悉,但步骤是:
register m128 c = b;
c -= a;
c >>= 15;
c = ~c;
c &= a;
b -= c;
Run Code Online (Sandbox Code Playgroud)
这是步骤更少的替代方案:
register m128 c = compare_ge(b, a);
c = -c;
c &= a;
b -= c;
Run Code Online (Sandbox Code Playgroud)