2015-06-08 39 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:謝謝你的支持。我在蒙克頓拜訪我的兄弟幾天後去看他正在參加的晚宴劇場表演。 –