3 回答

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