我正在爲嵌入式計算機編寫程序,並且內存和處理能力都很小。計算MIPS表達式的有效方法
ÿ和一個是存儲在浮點寄存器雙和X爲陣列雙打的。在MIPS中編寫此表達式的最有效方式是什麼?
y = y + a * x[i];
我正在爲嵌入式計算機編寫程序,並且內存和處理能力都很小。計算MIPS表達式的有效方法
ÿ和一個是存儲在浮點寄存器雙和X爲陣列雙打的。在MIPS中編寫此表達式的最有效方式是什麼?
y = y + a * x[i];
我用不流利的MIPS彙編,所以我不會有實際的MIPS指令的麻煩,我會使用類似簡單的英語中途Z80/86 TASM,希望你會明白我的意思。
而且我會假設你想要添加一個完整的數組,而不僅僅是這一行,因爲這改變了任務的一切。
如果你真的想要優化這條線,那麼就沒有多少空間可以做到這一點。只需加載x [i],將其乘以a,然後將結果添加到y。
如果你正在談論一些固定大小的數組(比如矩陣中的大小4),可能會有一些直接展開的方式比從我這裏得到的更快。
如果我們談論的是一些陣列,這是不同的(但你應該張貼這樣的),你可以節省很多(N-1)乘法首先總結了X數組:
load r1, x_array_pointer
load r2, x_array_end_pointer
load fpr0, zero_value
:loop_sum_x_array
add fpr0,[r1]
add r1,size_of_double
cmp r1,r2
jump_less loop_sum_x_array ; till whole array is summed
mul fpr0, *a* ; now multiply sum{x} by "a"
add fpr0, *y* ; and add initial "y" value
; fpr0 contains result
「算法」:y + a * x0 + a * x1 + a * x2 + ... = y + a *(x0 + x1 + x2 + ...)(如果您沒有圖在你發佈到SO之前,你可以自己去嘗試,或者你還沒有嘗試,或者你已經8歲了,或者你應該認真做一些思考和基本的數學練習,因爲這很明顯。 ,實際上,在這個難度級別上它是純粹的樂趣,爲什麼你讓其他人在你的住處好玩?你非常慷慨,先生。 :))
內存:這不使用任何額外的內存,只有輸入Ÿ,一個和X,則需要幾個臨時寄存器(R1,R2,fpr0)(所以只要因爲你沒有做8位的CPU操作,所以你應該有足夠的備用)。處理能力:算法的複雜度是O(n)(因爲你必須從x數組中添加每個值,所以你不能打敗它)。內部循環使用相當基本的指令:一個浮點加法,從存儲器加載雙值,地址遞增,比較和條件跳轉。然後它需要從字面上一個浮點乘法和一個更多的fp加法。 x數組以順序方式訪問,所以內存緩存未命中應該是最小的。
如果你的CPU有任何專門的指令,比如MMX,大數組的總數可能會更快地被寫入。但是對於大型陣列的現代CPU + RAM,你將主要受限於內存緩存速度,因爲內部循環對於GHz CPU來說是不存在的(除了從內存加載值以外)。
編輯:正如Michael指出的那樣,使用C編譯器是正確的方法,我只是爲了寫一些僞彙編器而做了我的答案。我不確定你的平臺是什麼,但是如果它是值得的,必須有PC的交叉編譯器以及將二進制結果傳送到目標的方式。
這是一個完全可以接受的答案,你介意一些建議嗎? 1)要成熟。留下* 8yo *和*開心*的東西。這聽起來像一個青少年談論性。 2)迴應意見和評論(最後一段)。 3)避免文本牆,格式4)有關高速緩存和SIMD實例的事情有點幼稚,現代CPU必須保持忙碌(避免瓶頸),而不僅僅是加載/存儲。 5)準確:8位意味着沒有關於寄存器數量,數組是順序訪問(不是線性),MMX是真的老和特定的,O(n)是一個Theta(n),... –
1)謝謝:) 5)我知道有限數量的寄存器的最後一個CPU是8位時代的6502/6510,任何16位都有很多(與6502相比)。 MIPS是類似RISC的,所以實際上它有很多^ 2。 4)你在內存加載/存儲之間做什麼? (除非用高級語言編程)回到Z80時,速度比寄存器與內存的比例大約爲1:2,即使在內存中進行一些計算也是合理的。現代個人電腦在每個時鐘週期內完成大約1-2條指令! L0 4k頁面緩存未命中可以是1000+滴答。你要麼做一些計算,要麼等待RAM。 – Ped7g
現在,在嵌入式系統上,8位微控制器仍然被大量使用,這些嵌入式系統不需要性能,但需要在很長一段時間內可靠地運行。他們中的大多數只有1個寄存器(累加器),除了AVR和少數我不知道的 –
那麼,你現在有什麼?你有什麼理由相信現代C編譯器不會生成高效的代碼? – Michael
不幸的是,我不必選擇使用C:( –
)爲什麼會這樣呢?我用C編寫了8kB RAM和CPU的系統的軟件,能夠執行大概一百萬指令/秒。不打算用C編寫所有的代碼,你仍然可以使用C編譯器生成彙編代碼,以便將自己的彙編代碼打開。 – Michael