nsa*_*ers 13 c optimization performance sse simd
我正在寻找在SSE寄存器中打包的所有四个浮点数上翻转符号的最有效方法.
我没有在英特尔架构软件开发手册中找到这样做的固有内容.以下是我已经尝试过的事情.
对于每个案例,我在代码上循环了100亿次并得到了指示时间.我试图至少匹配4秒,这需要我的非SIMD方法,这只使用一元减号运算符.
[48秒]
_mm_sub_ps( _mm_setzero_ps(), vec );
[32秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9秒]
union NegativeMask {
int intRep;
float fltRep;
} negMask;
negMask.intRep = 0x80000000;
_mm_xor_ps( _mm_set1_ps( negMask.fltRep ), vec );
编译器是带有-O3的gcc 4.2.CPU是英特尔酷睿2双核处理器.
Lir*_*una 22
这个联盟并不是真正需要的,最好的世界(可读性,速度和可移植性):
_mm_xor_ps(vec, _mm_set1_ps(-0.f))
Run Code Online (Sandbox Code Playgroud)
只是为了通过有关这些内置向量的 gcc 文档来完成您自己的答案:
The types defined in this manner can be used with a subset of normal C
operations. Currently, GCC will allow using the following operators on
these types: `+, -, *, /, unary minus, ^, |, &, ~'.
Run Code Online (Sandbox Code Playgroud)
如果可能的话,始终坚持这些可能是个好主意。gcc 很有可能始终为 SSE 提供最有效的代码。
对于您的编译器选项,添加一些更具体到您的体系结构的内容,-march=native在大多数情况下都会这样做。