2015-06-08 36 views
0

增加值在我的代码我解决如何从载体到彼此

y=x^2-4x+6 

我用SSE积分 - 它可以让我在一个时间上的4个值进行操作。我制作了一个程序,用0到5的值分解为5个4元素向量n1,n2,n3,n4来求解该积分。

.data 
n1: .float 0.3125,0.625,0.9375,1.25 
n2: .float 1.5625,1.875,2.1875,2.5 
n3: .float 2.8125,3.12500,3.4375,3.75 
n4: .float 4.0625,4.37500,4.6875,5 
szostka: .float 6,6,6,6 
czworka: .float 4,4,4,4 
.text 
.global main 
main: 
     movups (n1),%xmm0 

     mulps %xmm0,%xmm0 
     movups (szostka),%xmm2 
     addps %xmm2,%xmm0 
     movups (n1),%xmm1 
     movups (czworka),%xmm2 
     mulps %xmm2,%xmm1 
     subps %xmm1,%xmm0 
     movups %xmm0,%xmm7 

     movups (n2),%xmm0 

     mulps %xmm0,%xmm0 
     movups (szostka),%xmm2 
     addps %xmm2,%xmm0 
     movups (n1),%xmm1 
     movups (czworka),%xmm2 
     mulps %xmm2,%xmm1 
     subps %xmm1,%xmm0 
     movups %xmm0,%xmm6 

     movups (n3),%xmm0 

     mulps %xmm0,%xmm0 
     movups (szostka),%xmm2 
     addps %xmm2,%xmm0 
     movups (n1),%xmm1 
     movups (czworka),%xmm2 
     mulps %xmm2,%xmm1 
     subps %xmm1,%xmm0 
     movups %xmm0,%xmm5 

     movups (n4),%xmm0 

     mulps %xmm0,%xmm0 
     movups (szostka),%xmm2 
     addps %xmm2,%xmm0 
     movups (n1),%xmm1 
     movups (czworka),%xmm2 
     mulps %xmm2,%xmm1 
     subps %xmm1,%xmm0 
     movups %xmm0,%xmm4 

     mov $1,%eax 
     mov $0,%ebx 
     int $0x80 

最后,我在寄存器xmm7,xmm6,xmm5,xmm4中有4个向量。为了求积分,我需要向对方添加矢量(这很简单),然后将矢量的值也相互添加。
我该怎么做?

+1

假设你要添加的元素水平,你可以用'haddps'。你需要调用它两次来总结所有4个元素。 –

+1

请记住,''haddps''需要SSE3支持。 –

+0

那么还有什么我可以做的吗? – DzikiChrzan

回答

1

正如保罗·R在作为评论说,你可以在载体中使用haddps的水平OPS,在最后。

你的代码看起来效率低下。如果要完全展开,而不是使用循环和累加器,则可以首先为每个副本使用不同的寄存器,而不是在每个块的末尾都有一个movups %xmm0,%xmmX

另外,请(szostka)(czworka)在各次迭代间寄存器。不要每次都重新加载它们。同样,将movups (n1),%xmm1替换为movups %xmm0, %xmm1(之前您的方块%xmm0)。在IvyBridge和更高版本上,寄存器重命名阶段处理reg-reg动作,它们发生的延迟时间为零。

如果您确实需要每次加载(szostka),则最好使用带有内存操作数的addps而不是单独的移动和添加。微融合可以将操作保持为一个单一的操作。

退房http://agner.org/optimize/关于如何优化装配文档。您可能会发现使用内在函数更有用,让编译器能够处理寄存器分配等小细节,而不是直接写入asm。

+0

[这个问题](http://stackoverflow.com/q/38187690/2542702)是给你回答的。 –

+0

@Zboson:谢谢你的支持。我在蒙克顿拜访我的兄弟几天后去看他正在参加的晚宴剧场表演。 –