天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

多核編程的藝術(shù)_1.4 源代碼到匯編語(yǔ)言的轉(zhuǎn)換

發(fā)布時(shí)間:2016-12-20 17:38

  本文關(guān)鍵詞:多核應(yīng)用編程實(shí)戰(zhàn),由筆耕文化傳播整理發(fā)布。


> 其他綜合 > 多核應(yīng)用編程實(shí)戰(zhàn) 1.4 源代碼到匯編語(yǔ)言的轉(zhuǎn)換 2013-05-17 14:22:05         我要投稿   

本文所屬圖書(shū) > 多核應(yīng)用編程實(shí)戰(zhàn)

面向主流平臺(tái)打造多核應(yīng)用程序,真正實(shí)現(xiàn)高性能與高可擴(kuò)展性并舉!多核應(yīng)用編程實(shí)戰(zhàn)》是一本全面、實(shí)用的高性能多核應(yīng)用編程指南,不僅介紹了在Windows、Linux和Oracle Solaris上實(shí)現(xiàn)并行化的前沿方法,而且通...  立即去當(dāng)當(dāng)網(wǎng)訂購(gòu)

處理器執(zhí)行指令,指令是所有計(jì)算的基本構(gòu)建塊,執(zhí)行如加法、從內(nèi)存提取數(shù)據(jù)或?qū)?shù)據(jù)存儲(chǔ)回內(nèi)存等任務(wù)。指令在寄存器上進(jìn)行操作,寄存器保存變量的當(dāng)前值和其他機(jī)器狀態(tài)?紤]代碼清單1-1所示的代碼段,其功能為遞增指針ptr指向的整型變量。

代碼清單1-1 將某個(gè)地址的變量+1的代碼

void func( int * ptr )

{

    ( *ptr )++;

}

代碼清單1-2顯示了此代碼段編譯為SPARC匯編代碼的結(jié)果。

代碼清單1-2 將某個(gè)地址的變量+1的SPARC匯編代碼

ld      [%o0], %o5     //將地址%o0的值加載到寄存器%o5

add     %o5, 1, %o5    //將寄存器%o5的值加1

st      %o5, [%o0]     //將寄存器%o5的值存回地址%o0

retl                   //從例程返回

SPARC代碼[①]通過(guò)寄存器%o0傳遞指針ptr。加載指令將該地址的值載入寄存器%o5。接著增加寄存器%o5的值,接著存儲(chǔ)指令將寄存器%o5中的新整數(shù)值存儲(chǔ)到%o0所指向的內(nèi)存位置,最后返回指令退出例程。

代碼清單1-3顯示了這一源代碼基于32位x86處理器的編譯結(jié)果,x86的匯編代碼確實(shí)與SPARC匯編代碼有所不同。第一個(gè)不同之處在于32位模式的x86有一個(gè)基于棧的調(diào)用約定。這意味著傳遞給函數(shù)的所有參數(shù)都將存儲(chǔ)到棧,而之后函數(shù)要做的第一件事就是取回存儲(chǔ)在棧的參數(shù)。因此,代碼做的第一件事就是從棧中加載指針的值(在本例中,就是從地址%esp+4獲取值,然后將值放入寄存器%eax。

代碼清單1-3 將某個(gè)地址的值+1的32位x86匯編代碼

movl     4(%esp), %eax  //將地址%esp+4中的值加載到%eax

addl     $1, (%eax)     //將地址%eax中的值+1

ret                     //從例程返回

接下來(lái),我們遇到了x86和SPARC匯編語(yǔ)言的第二個(gè)區(qū)別。SPARC是精簡(jiǎn)指令集計(jì)算機(jī)(RISC),也就是說(shuō)SPARC只有少量的簡(jiǎn)單指令,且所有操作都必須由這些簡(jiǎn)單的構(gòu)建塊構(gòu)成。x86則是復(fù)雜指令集計(jì)算機(jī)(CISC),,因此其指令能完成更復(fù)雜的操作。x86指令集有一個(gè)指令是將某個(gè)內(nèi)存地址中的值與一個(gè)增量相加。在本例中,寄存器%eax中存放一個(gè)地址,指令將該地址中的值加1。執(zhí)行這條CISC指令,即能達(dá)到SPARC 3條RISC指令的執(zhí)行結(jié)果。

為了進(jìn)行計(jì)算,這兩個(gè)代碼段都使用了兩個(gè)寄存器。SPARC的代碼中使用了寄存器%o0和%o5,而x86代碼則使用了%esp和%eax。然而,兩個(gè)代碼段使用寄存器的目的不同。x86代碼將寄存器%esp用作棧指針,指向保存函數(shù)調(diào)用參數(shù)的內(nèi)存區(qū)。與之不同,SPARC代碼則用寄存器傳遞函數(shù)參數(shù)。傳遞參數(shù)的方法稱為調(diào)用約定,是平臺(tái)應(yīng)用程序二進(jìn)制接口(ABI)的一部分。該規(guī)范說(shuō)明應(yīng)該怎樣編寫(xiě)程序才能使其在某個(gè)特定平臺(tái)上正確運(yùn)行。

這兩個(gè)代碼段都使用一個(gè)寄存器保存要訪問(wèn)的內(nèi)存地址。SPARC的代碼中使用%o0,x86代碼中使用%eax。兩個(gè)代碼段的另一區(qū)別是SPARC代碼中用寄存器%o0保存變量的值,因此SPARC的代碼不得不使用3條指令加載值,加1,然后將結(jié)果存回內(nèi)存。相比之下,x86代碼只用了一條指令。

兩個(gè)處理器之間的又一個(gè)不同之處是可用寄存器的數(shù)量。SPARC實(shí)際上有32個(gè)通用寄存器,而x86處理器只有8個(gè)通用寄存器。由于某些通用寄存器具有特殊功能,最終SPARC處理器有約24個(gè)寄存器可供應(yīng)用程序使用,而32位x86處理器只有6個(gè)可用于應(yīng)用程序。然而,由于x86處理器采用CISC指令集,所以并不需要使用寄存器來(lái)保存暫時(shí)需要的值,在本例中,變量在內(nèi)存中的當(dāng)前值甚至并未加載到寄存器。因此,盡管x86處理器寄存器數(shù)量少得多,仍然可以編寫(xiě)代碼,因此寄存器不是問(wèn)題。

但不可否認(rèn),寄存器數(shù)量多確實(shí)有優(yōu)勢(shì)。如寄存器數(shù)量不足,寄存器就不得不在清空前先將其內(nèi)容存儲(chǔ)到內(nèi)存,使用后再將原內(nèi)容從內(nèi)存重新載入。這稱為寄存器溢出與載入,需要兩個(gè)額外的指令,并需使用緩存空間。

x86的64位指令集擴(kuò)展中引入的兩個(gè)性能優(yōu)勢(shì)就是寄存器數(shù)量增加以及調(diào)用約定大為改進(jìn)。

點(diǎn)擊復(fù)制鏈接 與好友分享!回本站首頁(yè) 您對(duì)本文章有什么意見(jiàn)或著疑問(wèn)嗎?請(qǐng)到論壇討論您的關(guān)注和建議是我們前行的參考和動(dòng)力   上一篇: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 堅(jiān)持學(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)用編程實(shí)戰(zhàn),由筆耕文化傳播整理發(fā)布。



本文編號(hào):221281

資料下載
論文發(fā)表

本文鏈接:http://sikaile.net/wenshubaike/mishujinen/221281.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶492b8***提供,本站僅收錄摘要或目錄,作者需要?jiǎng)h除請(qǐng)E-mail郵箱bigeng88@qq.com