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

C 使用SSE(x*x*x)的乘法,c,sse,C,Sse,我正在尝试使用SSE优化一个立方体函数 long cube(long n) { return n*n*n; } 我试过这个: return (long) _mm_mul_su32(_mm_mul_su32((__m64)n,(__m64)n),(__m64)n); 而且表现更差(是的,我从未对sse做过任何事情) 是否有可提高性能的SSE功能? 还是别的什么 来自cat/proc/cpuinfo的输出 processor : 0 vendor_id : GenuineInte

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

long cube(long n)
{
    return n*n*n;
}
我试过这个:

return (long) _mm_mul_su32(_mm_mul_su32((__m64)n,(__m64)n),(__m64)n);
而且表现更差(是的,我从未对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: 处理器:0 供应商id:GenuineIntel cpu系列:6 型号:15 型号名称:英特尔(R)至强(R)CPU 3070@2.66GHz 步进:6 cpu MHz:2660.074 缓存大小:4096 KB 物理标识:0 兄弟姐妹:2 核心id:0 cpu核心数:2 apicid:0 初始apicid:0 fpu:是的 fpu_例外:是 cpuid级别:10 wp:是的 标志: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系统调用nx lm常量tsc arch性能pebs bts代表良好pni DT64监视器DSU cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf lm tpr 博戈米普斯:5320.14 刷新大小:64 缓存对齐:64 地址大小:36位物理地址,48位虚拟地址 电源管理: 处理器:1 供应商id:GenuineIntel cpu系列:6 型号:15 型号名称:英特尔(R)至强(R)CPU 3070@2.66GHz 步进:6 cpu MHz:2660.074 缓存大小:4096 KB 物理标识:0 兄弟姐妹:2 核心id:1 cpu核心数:2 apicid:1 初始apicid:1 fpu:是的 fpu_例外:是 cpuid级别:10 wp:是的 标志: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系统调用nx lm常量tsc arch性能pebs bts代表良好pni DT64监视器DSU cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf lm tpr 博戈米普斯:5320.35 刷新大小:64 缓存对齐:64 地址大小:36位物理地址,48位虚拟地址 电源管理:
我想你误解了什么时候使用SSE是有用的。但我只将SSE用于浮点类型,因此我的经验可能不适用于这种情况。我希望你仍然能从我写的东西中学到一些东西

SSE提供单指令多数据单指令多数据。当有多个值要对其执行相同的计算时,此选项非常有用。这是一种小规模的并行化。所以你可以同时做四个乘法,而不是一个乘法。但它只有在所有依赖项都可用时才有用


因此,在您的情况下,没有并行化的空间。你可以编写一个计算四个浮点数的立方体的函数,这比调用一个计算四次一个数的立方体的函数要快。

我想你误解了什么时候使用SSE是有用的。但我只将SSE用于浮点类型,因此我的经验可能不适用于这种情况。我希望你仍然能从我写的东西中学到一些东西

SSE提供单指令多数据单指令多数据。当有多个值要对其执行相同的计算时,此选项非常有用。这是一种小规模的并行化。所以你可以同时做四个乘法,而不是一个乘法。但它只有在所有依赖项都可用时才有用


因此,在您的情况下,没有并行化的空间。您可以编写一个计算四个
float
s的多维数据集的函数,这比调用一个计算四次一个数字的多维数据集的函数要快。

您必须将变量按16个字节对齐,例如。另外,根据我自己对SSE的修补经验,如果你在一整批值上计算你的函数,你将获得显著的收益。。。说

cube(long* inArray, long* outArray, size_t size) {
  ...
}

例如,您必须在16个字节上对齐变量。另外,根据我自己对SSE的修补经验,如果你在一整批值上计算你的函数,你将获得显著的收益。。。说

cube(long* inArray, long* outArray, size_t size) {
  ...
}
您的代码编译为:

cube:
        movl    4(%esp), %edx
        movl    %edx, %eax
        imull   %edx, %eax
        imull   %edx, %eax
        ret
如果内联,ret和moves将得到优化,因此您有两个imul指令。我怀疑mmx或SSE是否能加快速度(仅将数据传输到mmx/SSE寄存器可能比两个imuls慢)

您的代码编译为:

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

如果内联,ret和moves将得到优化,因此您有两个imul指令。我怀疑mmx或SSE是否能加快速度(仅将数据传输到mmx/SSE寄存器可能比两个imuls慢)

您的平台是什么,您是否检查了编译器是否已经输出了最佳(或接近)结果?我没有检查,但据我所知,gcc编译器不会自动执行。SSE用于同时处理多个元素(计算多个多维数据集),而不是提高单个操作的计算能力。您的平台是什么?您是否检查了编译器是否已经输出了最佳(或接近)结果?我没有检查它,但据我所知,gcc编译器不会自动执行此操作。SSE用于同时处理多个元素(计算多个多维数据集),而不是提高单个操作的计算速度。我有多个数据,它的n和n以及我想要的3个值multiply@sherif没有。您有
n
n*n
,和
(n*n)*n
。如果没有第二个值,则无法计算最后一个值。也就是说,不可能并行化。如果你有
s
t
并且想要计算
s*s*s
t*t*t
你可以同时做一些计算。我怎么做?我在for语句中调用多维数据集函数,我可能会生成类似于sss和tttI的东西。我问了一个关于(xxx)+(yyy)的新问题。我有多个数据,它的n和n,还有3个值multiply@sherif没有。您有
n
n*n
(n*n)*n
。如果没有第二个值,则无法计算最后一个值。也就是说,不可能并行化。如果您有
s
t
并且想要计算
s*s