乘法使用SSE(x * x * x)

我正在尝试使用SSE优化立方体函数

long cube(long n)
{
    return n*n*n;
}

我试过这个:

return (long) _mm_mul_su32(_mm_mul_su32((__m64)n,(__m64)n),(__m64)n);

而且表现更差(是的,我从来没有做过任何事情)。

是否有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,单指令多数据。 如果您有许多要执行相同计算的值,则它很有用。 这是一种小规模并行化。 所以,不要做一次乘法,你可以同时做四次。 但它只有在你有所有可用的依赖关系时才有用。

所以在你的情况下,没有平行化的余地。 你可以编写一个计算四个float的立方体的函数,这比调用四次计算一个数字立方体的函数要快。


您的代码编译为:

cube:
        movl    4(%esp), %edx
        movl    %edx, %eax
        imull   %edx, %eax
        imull   %edx, %eax
        ret

如果内联ret和移动会得到优化,所以你有两个imul指令。 我怀疑mmx或SSE可能会更快(将数据单独传输到mmx / sse寄存器可能会比两个更慢)


你必须在16个字节上对齐你的变量。 另外,根据我自己的经验,使用SSE可以获得显着的收益,如果你计算你的函数在整个批量值上...说

cube(long* inArray, long* outArray, size_t size) {
  ...
}
链接地址: http://www.djcxy.com/p/72563.html

上一篇: multiplication using SSE (x*x*x)

下一篇: (ARM assembly) Fastest way to access banked registers between processor modes?