使用SSE将4个浮点数乘以4个浮点数的最有效方法是什么?

hor*_*guy 2 c assembly gcc sse sse2

我目前有以下代码:

float a[4] = { 10, 20, 30, 40 };
float b[4] = { 0.1, 0.1, 0.1, 0.1 };
asm volatile("movups (%0), %%xmm0\n\t"
             "mulps (%1), %%xmm0\n\t"             
             "movups %%xmm0, (%1)"             
             :: "r" (a), "r" (b));
Run Code Online (Sandbox Code Playgroud)

我首先要问几个问题:

(1)如果我要在16字节边界上对齐数组,它甚至可以工作吗?由于数组是在堆栈上分配的,因此对齐它们几乎是不可能的吗?

看到这篇文章的选定答案:堆栈变量是否由GCC __attribute __((aligned(x)))对齐?

(2)代码是否可以重构以提高效率?如果我将两个浮点数组都放在寄存器而不只是一个?

谢谢

xcr*_*mps 7

用C写,用

gcc -S -mssse3
Run Code Online (Sandbox Code Playgroud)

如果你有一个相当新版本的gcc.