多核編程的藝術(shù)_1.4 源代碼到匯編語言的轉(zhuǎn)換
本文關(guān)鍵詞:多核應(yīng)用編程實戰(zhàn),由筆耕文化傳播整理發(fā)布。
> 其他綜合 > 多核應(yīng)用編程實戰(zhàn) 1.4 源代碼到匯編語言的轉(zhuǎn)換 2013-05-17 14:22:05 我要投稿
本文所屬圖書 > 多核應(yīng)用編程實戰(zhàn)
面向主流平臺打造多核應(yīng)用程序,真正實現(xiàn)高性能與高可擴(kuò)展性并舉!多核應(yīng)用編程實戰(zhàn)》是一本全面、實用的高性能多核應(yīng)用編程指南,不僅介紹了在Windows、Linux和Oracle Solaris上實現(xiàn)并行化的前沿方法,而且通... 立即去當(dāng)當(dāng)網(wǎng)訂購
處理器執(zhí)行指令,指令是所有計算的基本構(gòu)建塊,執(zhí)行如加法、從內(nèi)存提取數(shù)據(jù)或?qū)?shù)據(jù)存儲回內(nèi)存等任務(wù)。指令在寄存器上進(jìn)行操作,寄存器保存變量的當(dāng)前值和其他機(jī)器狀態(tài)?紤]代碼清單1-1所示的代碼段,其功能為遞增指針ptr指向的整型變量。
代碼清單1-1 將某個地址的變量+1的代碼
void func( int * ptr )
{
( *ptr )++;
}
代碼清單1-2顯示了此代碼段編譯為SPARC匯編代碼的結(jié)果。
代碼清單1-2 將某個地址的變量+1的SPARC匯編代碼
ld [%o0], %o5 //將地址%o0的值加載到寄存器%o5
add %o5, 1, %o5 //將寄存器%o5的值加1
st %o5, [%o0] //將寄存器%o5的值存回地址%o0
retl //從例程返回
SPARC代碼[①]通過寄存器%o0傳遞指針ptr。加載指令將該地址的值載入寄存器%o5。接著增加寄存器%o5的值,接著存儲指令將寄存器%o5中的新整數(shù)值存儲到%o0所指向的內(nèi)存位置,最后返回指令退出例程。
代碼清單1-3顯示了這一源代碼基于32位x86處理器的編譯結(jié)果,x86的匯編代碼確實與SPARC匯編代碼有所不同。第一個不同之處在于32位模式的x86有一個基于棧的調(diào)用約定。這意味著傳遞給函數(shù)的所有參數(shù)都將存儲到棧,而之后函數(shù)要做的第一件事就是取回存儲在棧的參數(shù)。因此,代碼做的第一件事就是從棧中加載指針的值(在本例中,就是從地址%esp+4獲取值,然后將值放入寄存器%eax。
代碼清單1-3 將某個地址的值+1的32位x86匯編代碼
movl 4(%esp), %eax //將地址%esp+4中的值加載到%eax
addl $1, (%eax) //將地址%eax中的值+1
ret //從例程返回
接下來,我們遇到了x86和SPARC匯編語言的第二個區(qū)別。SPARC是精簡指令集計算機(jī)(RISC),也就是說SPARC只有少量的簡單指令,且所有操作都必須由這些簡單的構(gòu)建塊構(gòu)成。x86則是復(fù)雜指令集計算機(jī)(CISC),,因此其指令能完成更復(fù)雜的操作。x86指令集有一個指令是將某個內(nèi)存地址中的值與一個增量相加。在本例中,寄存器%eax中存放一個地址,指令將該地址中的值加1。執(zhí)行這條CISC指令,即能達(dá)到SPARC 3條RISC指令的執(zhí)行結(jié)果。
為了進(jìn)行計算,這兩個代碼段都使用了兩個寄存器。SPARC的代碼中使用了寄存器%o0和%o5,而x86代碼則使用了%esp和%eax。然而,兩個代碼段使用寄存器的目的不同。x86代碼將寄存器%esp用作棧指針,指向保存函數(shù)調(diào)用參數(shù)的內(nèi)存區(qū)。與之不同,SPARC代碼則用寄存器傳遞函數(shù)參數(shù)。傳遞參數(shù)的方法稱為調(diào)用約定,是平臺應(yīng)用程序二進(jìn)制接口(ABI)的一部分。該規(guī)范說明應(yīng)該怎樣編寫程序才能使其在某個特定平臺上正確運(yùn)行。
這兩個代碼段都使用一個寄存器保存要訪問的內(nèi)存地址。SPARC的代碼中使用%o0,x86代碼中使用%eax。兩個代碼段的另一區(qū)別是SPARC代碼中用寄存器%o0保存變量的值,因此SPARC的代碼不得不使用3條指令加載值,加1,然后將結(jié)果存回內(nèi)存。相比之下,x86代碼只用了一條指令。
兩個處理器之間的又一個不同之處是可用寄存器的數(shù)量。SPARC實際上有32個通用寄存器,而x86處理器只有8個通用寄存器。由于某些通用寄存器具有特殊功能,最終SPARC處理器有約24個寄存器可供應(yīng)用程序使用,而32位x86處理器只有6個可用于應(yīng)用程序。然而,由于x86處理器采用CISC指令集,所以并不需要使用寄存器來保存暫時需要的值,在本例中,變量在內(nèi)存中的當(dāng)前值甚至并未加載到寄存器。因此,盡管x86處理器寄存器數(shù)量少得多,仍然可以編寫代碼,因此寄存器不是問題。
但不可否認(rèn),寄存器數(shù)量多確實有優(yōu)勢。如寄存器數(shù)量不足,寄存器就不得不在清空前先將其內(nèi)容存儲到內(nèi)存,使用后再將原內(nèi)容從內(nèi)存重新載入。這稱為寄存器溢出與載入,需要兩個額外的指令,并需使用緩存空間。
x86的64位指令集擴(kuò)展中引入的兩個性能優(yōu)勢就是寄存器數(shù)量增加以及調(diào)用約定大為改進(jìn)。
點(diǎn)擊復(fù)制鏈接 與好友分享!回本站首頁 您對本文章有什么意見或著疑問嗎?請到論壇討論您的關(guān)注和建議是我們前行的參考和動力 上一篇:1.3 多處理器系統(tǒng)的特征 下一篇:1.4.1 32位與64位代碼的性能 相關(guān)文章1.4 猜數(shù)游戲
1.4 職業(yè)道德
1.4.1 了解你的領(lǐng)域
1.4.2 堅持學(xué)習(xí)
1.4.3 練習(xí)
1.4.4 合作
1.4.5 輔導(dǎo)
1.4.6 了解業(yè)務(wù)領(lǐng)域
1.4.7 與雇主/客戶保持一致
1.4.8 謙遜
圖文推薦本文關(guān)鍵詞:多核應(yīng)用編程實戰(zhàn),由筆耕文化傳播整理發(fā)布。
本文編號:221281
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/221281.html