3 回答

TA貢獻(xiàn)1843條經(jīng)驗 獲得超7個贊
從我在你的算法中看到的,你肯定沒有太多可以改進(jìn)它。
你遇到的問題可能不是分支到一個對齊的位置,盡管這仍然有幫助,你當(dāng)前的問題更可能是管道機(jī)制。
當(dāng)你一個接一個地寫兩條指令時,例如:
mov %eax, %ebx
add 1, %ebx
為了執(zhí)行第二條指令,必須完成第一條指令。因此,編譯器傾向于混合指令。假設(shè)你需要設(shè)置%ecx為零,你可以這樣做:
mov %eax, %ebx
xor %ecx, %ecx
add 1, %ebx
在這種情況下,mov和xor都可以并行執(zhí)行。這使得事情變得更快......并行處理的指令數(shù)量在處理器之間變化很大(Xeons通常更好)。
分支添加另一個參數(shù),其中最佳處理器可以同時開始執(zhí)行分支的兩側(cè)(true和false ...)。但實際上大多數(shù)處理器都會猜測并希望它們是正確的。
最后,很明顯,轉(zhuǎn)換sqrt()結(jié)果的整數(shù)將使事情很多更快,因為你會避免一切無感與SSE2代碼,如果只用于轉(zhuǎn)換+比較時,這兩個指令可以用做是明確慢整數(shù)。
現(xiàn)在......你可能仍然想知道為什么對齊與整數(shù)無關(guān)。事實是,如果您的代碼適合L1指令緩存,那么對齊并不重要。如果你丟失了L1緩存,那么它必須重新加載代碼,這就是對齊變得非常重要的地方,因為在每個循環(huán)上它可能會加載無用的代碼(可能是15個字節(jié)的無用代碼......)并且內(nèi)存訪問仍然死慢。
- 3 回答
- 0 關(guān)注
- 916 瀏覽
添加回答
舉報