dor*_*mon 6 c x86 sse simd vectorization
是否有任何单个指令或函数可以反转 __m128内每个浮点的符号?即a = r0:r1:r2:r3 ===> a = -r0:-r1:-r2:-r3?
我知道这可以通过_mm_sub_ps(_mm_set1_ps(0.0),a),但是它是否可能很慢,因为它_mm_set1_ps(0.0)是一个多指令函数?
Pau*_*l R 19
在实践中,您的编译器应该很好地为0.0生成常量向量.它可能只是使用_mm_xor_ps,如果你的代码在一个循环中,它应该提升循环中的常量生成.所以,底线,使用你原来的想法:
v = _mm_sub_ps(_mm_set1_ps(0.0), v);
Run Code Online (Sandbox Code Playgroud)
或另一个常见的伎俩,即:
v = _mm_xor_ps(v, _mm_set1_ps(-0.0));
Run Code Online (Sandbox Code Playgroud)
它只是翻转符号位而不是进行减法(不像第一种方法那样安全,因为它不能用NaN做正确的事情,但在某些情况下可能更有效).