我正在尝试使用SSE优化立方体功能
long cube(long n)
{
return n*n*n;
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
return (long) _mm_mul_su32(_mm_mul_su32((__m64)n,(__m64)n),(__m64)n);
Run Code Online (Sandbox Code Playgroud)
而且表现更差(是的,我从未对sse做过任何事情).
是否有可以提高性能的SSE功能?或者是其他东西?
cat/proc/cpuinfo的输出
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Xeon(R) CPU 3070 @ 2.66GHz stepping : 6 cpu MHz : 2660.074 cache size : 4096 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow bogomips : 5320.14 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Xeon(R) CPU 3070 @ 2.66GHz stepping : 6 cpu MHz : 2660.074 cache size : 4096 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow bogomips : 5320.35 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management:
我认为你误解了什么时候使用SSE是有用的.但我只使用了具有浮点类型的SSE,所以我的经验可能不适用于这种情况.我希望你还能从我写的东西中学到一些东西.
SSE提供SIMD,单指令多数据.当您有许多值要执行相同的计算时,它很有用.它是一种小规模的并行化.因此,您可以同时执行四次乘法,而不是进行一次乘法运算.但它仅在您拥有所有依赖项时才有用.
所以在你的情况下,没有并行化的余地.您可以编写一个函数来计算四个floats 的立方体,这比调用一个计算一个数字的立方体四次的函数要快.
您的代码编译为:
cube:
movl 4(%esp), %edx
movl %edx, %eax
imull %edx, %eax
imull %edx, %eax
ret
Run Code Online (Sandbox Code Playgroud)
如果内联ret和移动将被优化,所以你有两个imul指令.我怀疑mmx或SSE能否更快地完成这项任务(将数据单独传输到mmx/sse寄存器可能会慢于两个imuls)