專(zhuān)利名稱(chēng):動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法,用于提高動(dòng)態(tài)二進(jìn)制翻譯器的性能以及為未來(lái)的優(yōu)化工作提供一種新的框架和新的思路。本發(fā)明屬于二進(jìn)制翻譯技術(shù)領(lǐng)域。
背景技術(shù):
動(dòng)態(tài)二進(jìn)制翻譯技術(shù)是虛擬機(jī)技術(shù)中非常重要的一種實(shí)現(xiàn)方法,其特點(diǎn)在于在沒(méi)有任何高級(jí)語(yǔ)言源代碼信息的條件下,可以通過(guò)直接加載源機(jī)器端的二進(jìn)制可執(zhí)行程序,并利用自身對(duì)不同機(jī)器指令集架構(gòu)(ISA)的翻譯功能,得到目標(biāo)機(jī)器端的可執(zhí)行二進(jìn)制程序,從而達(dá)到跨平臺(tái)執(zhí)行程序的目的。但是,這種技術(shù)目前仍處于探索和研究的階段,各種現(xiàn)有的翻譯器存在的普遍缺點(diǎn)是
性能較差,特別體現(xiàn)在各種跨體系結(jié)構(gòu)的動(dòng)態(tài)二進(jìn)制翻譯器上,例如QEMU (afast machine emulator)翻譯器的平均執(zhí)行時(shí)間是本地執(zhí)行時(shí)間的4-5倍左右,由上海交通大學(xué)動(dòng)態(tài)二進(jìn)制翻譯小組自主開(kāi)發(fā)的動(dòng)態(tài)二進(jìn)制翻譯器CrossBit (引自文獻(xiàn)Design and Implementation of CrossBit: Dynamic Binary Translation Infrastructure)的平均執(zhí)行時(shí)間也在4倍左右。這個(gè)缺點(diǎn)嚴(yán)重阻礙了動(dòng)態(tài)二進(jìn)制翻譯技術(shù)的普及和應(yīng)用,因此,優(yōu)化動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)的性能是一項(xiàng)極具實(shí)踐價(jià)值和研究意義的工作。
構(gòu)建熱路徑(profiling and building hot trace)是目前動(dòng)態(tài)二進(jìn)制翻譯器中最主要的優(yōu)化方法之一。熱路徑是指執(zhí)行次數(shù)較多的路徑,通常是通過(guò)剖分(profiling)技術(shù)識(shí)別到的大于某一個(gè)閾值的路徑。熱路徑的執(zhí)行效率對(duì)總的目標(biāo)代碼的執(zhí)行效率有很大的影響。構(gòu)建熱路徑的方法就是針對(duì)檢測(cè)到的各條熱路徑上的所有基本塊,進(jìn)行重新組織,把熱點(diǎn)的最后一條跳轉(zhuǎn)指令和它指向的最有可能跳轉(zhuǎn)到的目的基本塊拼湊在一起,從而有效地減少了大量跳轉(zhuǎn)指令的開(kāi)銷(xiāo),達(dá)到提高性能的目的。剖分是指通過(guò)對(duì)運(yùn)行中的程序進(jìn)行監(jiān)測(cè),對(duì)程序
3執(zhí)行行為特征的數(shù)據(jù)信息進(jìn)行收集的過(guò)程。常用的剖分方法有以下兩種-
1、 采用instrumentation (插樁)的方式,這種方式通過(guò)在代碼中插入探針指令或直接利用支持剖分技術(shù)的硬件來(lái)采集和程序執(zhí)行行為、特性有關(guān)的數(shù)據(jù)信息。這種方法由于借助軟件實(shí)現(xiàn),成本較低。
2、 采用sampling (采樣)的方式,這種方式以一定的時(shí)間間隔對(duì)程序運(yùn)行的相關(guān)數(shù)據(jù)進(jìn)行數(shù)據(jù)收集,而不需要對(duì)程序進(jìn)行修改,但是要借助硬件實(shí)現(xiàn),成本較高。
二進(jìn)制翻譯系統(tǒng)中構(gòu)建熱路徑的正常流程是首先,在每一個(gè)執(zhí)行基本塊中
插入profiling模塊,該模塊的功能就在于記錄每個(gè)基本塊的執(zhí)行次數(shù)。然后,一旦這段機(jī)器碼檢測(cè)到一個(gè)熱點(diǎn)(當(dāng)某個(gè)基本塊執(zhí)行次數(shù)大于特定的閾值時(shí),該基本塊就被稱(chēng)為一個(gè)熱點(diǎn)),程序就需要保存現(xiàn)場(chǎng),并執(zhí)行上下文切換操作,返回到高級(jí)語(yǔ)言中去調(diào)用相應(yīng)的構(gòu)建熱路徑的模塊,然后將調(diào)整后的熱路徑翻譯為新的可執(zhí)行代碼,這段可執(zhí)行代碼組成的塊被成為超級(jí)塊(Super block)。最后,當(dāng)該模塊返回超級(jí)塊后,系統(tǒng)將重新執(zhí)行這個(gè)超級(jí)塊。但是,構(gòu)建熱路徑和翻譯超級(jí)塊的工作本身和二進(jìn)制翻譯的正常執(zhí)行流程之間并沒(méi)有必然的聯(lián)系,而且使用這種線(xiàn)性的構(gòu)建熱路徑方式是以多次保存程序現(xiàn)場(chǎng)和引入額外的上下文切換操作來(lái)實(shí)現(xiàn)的。這部分開(kāi)銷(xiāo)對(duì)于熱路徑較多的程序還是相當(dāng)可觀(guān)的。因此,可以嘗試一種新的方法來(lái)更高效地完成熱路徑的構(gòu)建和超級(jí)塊的翻譯,從而更進(jìn)一步地提高整個(gè)動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)的性能。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法,防止因?yàn)闃?gòu)建熱路徑而引入的保存程序現(xiàn)場(chǎng)行為,減少額外的上下文切換開(kāi)銷(xiāo),提高整個(gè)動(dòng)態(tài)二進(jìn)制翻譯器系統(tǒng)的性能。
為實(shí)現(xiàn)上述目的,本發(fā)明首先將整個(gè)動(dòng)態(tài)二進(jìn)制翻譯器的基本塊翻譯和目標(biāo)代碼的執(zhí)行部分劃分為主執(zhí)行線(xiàn)程,然后將熱路徑的構(gòu)建和翻譯超級(jí)塊的部分劃分為子線(xiàn)程,并改變了通用的動(dòng)態(tài)二進(jìn)制翻譯器中獨(dú)立的代碼緩存(Cache)結(jié)構(gòu)為雙代碼緩存的設(shè)計(jì)方式,利用哈希函數(shù)統(tǒng)一管理這兩個(gè)代碼緩存,使主線(xiàn)程和子線(xiàn)程在數(shù)據(jù)查詢(xún)和更新過(guò)程中可以并行進(jìn)行,然后通過(guò)結(jié)合硬親和力(hardaffinity)使動(dòng)態(tài)二進(jìn)制翻譯器的主線(xiàn)程和子線(xiàn)程分別在兩個(gè)不同的處理器(CPU)核上運(yùn)行,最后,用連續(xù)的一段內(nèi)存空間和兩個(gè)計(jì)數(shù)器來(lái)模擬一段隊(duì)列,
在機(jī)器語(yǔ)言級(jí)和高級(jí)語(yǔ)言級(jí)進(jìn)行兩線(xiàn)程間的通信。
本發(fā)明的動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法具體實(shí)現(xiàn)步驟
如下
1、 本發(fā)明將原有動(dòng)態(tài)二進(jìn)制翻譯器的"翻譯,優(yōu)化,執(zhí)行"的串行執(zhí)行工作機(jī)制改變?yōu)?翻譯,執(zhí)行"的主程序流程與"構(gòu)建熱路徑和翻譯超級(jí)塊優(yōu)化"
的子程序流程并行的工作機(jī)制。具體為利用多線(xiàn)程編程的技術(shù),將基本塊翻
譯和目標(biāo)代碼的執(zhí)行部分作為主線(xiàn)程,將構(gòu)建熱路徑和翻譯超級(jí)塊部分作為子線(xiàn)程,主線(xiàn)程和子線(xiàn)程并行工作,構(gòu)成多線(xiàn)程的動(dòng)態(tài)二進(jìn)制翻譯器系統(tǒng)優(yōu)化架構(gòu)。
2、 原有的動(dòng)態(tài)二進(jìn)制翻譯器中采用了唯一的目標(biāo)代碼緩存(Target CodeCache)來(lái)存儲(chǔ)翻譯好的目標(biāo)代碼基本塊和熱路徑組成的超級(jí)塊。這種設(shè)計(jì)方式在并行工作機(jī)制中會(huì)造成主程序和子程序大量的內(nèi)存訪(fǎng)問(wèn)沖突,嚴(yán)重影響系統(tǒng)的性能,本發(fā)明將該設(shè)計(jì)方式改變?yōu)殡p目標(biāo)代碼緩存架構(gòu), 一個(gè)緩存用于存放主線(xiàn)程翻譯得到的目標(biāo)代碼基本塊(Target Code Basic Block),另一個(gè)緩存用于存放由子線(xiàn)程構(gòu)建熱路徑后得到的目標(biāo)代碼超級(jí)塊(Target Code Super Block),然后通過(guò)全局的哈希表函數(shù)來(lái)控制主線(xiàn)程和子線(xiàn)程對(duì)這兩個(gè)緩存的讀和更新操作。
3、 使用硬親和力將主線(xiàn)程分配在多核處理器的0號(hào)核上執(zhí)行,將子線(xiàn)程分配在1號(hào)核上執(zhí)行。
4、 主線(xiàn)程利用生產(chǎn)者計(jì)數(shù)器作為索引值,在機(jī)器語(yǔ)言級(jí)別對(duì)一段連續(xù)的內(nèi)存空間不斷地壓入熱點(diǎn)的入口地址,子線(xiàn)程利用消費(fèi)者計(jì)數(shù)器作為索引值,在高級(jí)語(yǔ)言級(jí)別不停地從這段連續(xù)的內(nèi)存空間去讀取熱點(diǎn)的入口地址,完成兩線(xiàn)程間的通信。
本發(fā)明的優(yōu)點(diǎn)在于利用多核多線(xiàn)程技術(shù),在為動(dòng)態(tài)二進(jìn)制翻譯器提供高質(zhì)量的優(yōu)化后目標(biāo)代碼的同時(shí),能夠盡量屏蔽掉構(gòu)建熱路徑算法本身開(kāi)銷(xiāo)對(duì)系統(tǒng)總性能的影響。本發(fā)明的特點(diǎn)在于采用了雙目標(biāo)緩存的設(shè)計(jì)方式,使基本塊翻譯和目標(biāo)代碼執(zhí)行的主線(xiàn)程與熱路徑的構(gòu)造和超級(jí)塊翻譯的子線(xiàn)程之間互不干
擾,并發(fā)明了一種更適合于本發(fā)明例中線(xiàn)程間通信場(chǎng)景的機(jī)制,這些技術(shù)為多線(xiàn)程方式構(gòu)建熱路徑的方法提供了高并行性和低同步開(kāi)銷(xiāo)的優(yōu)良特質(zhì),從而有效地加強(qiáng)了程序執(zhí)行的穩(wěn)定性和效率。同時(shí)由于本發(fā)明提出的方法對(duì)于其他的各種二進(jìn)制優(yōu)化算法同樣適用,因此也為今后動(dòng)態(tài)二進(jìn)制翻譯器的優(yōu)化工作提供了新的思路和新的框架。
圖1為動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法的系統(tǒng)框架圖。
具體實(shí)施例方式
為更好地理解本發(fā)明的技術(shù)方案,以下通過(guò)具體的實(shí)施例作進(jìn)一步描述。以下實(shí)施例不構(gòu)成對(duì)本發(fā)明的限定。1.設(shè)計(jì)新的系統(tǒng)架構(gòu)
本發(fā)明是基于上海交通大學(xué)自主開(kāi)發(fā)的動(dòng)態(tài)二進(jìn)制翻譯器CrossBit之上研制的,正常的CrossBit的執(zhí)行流程為(1)加載源可執(zhí)行映像;(2)查找哈希表中是否存在翻譯后的目標(biāo)機(jī)器碼對(duì)象;(3)若查找命中,執(zhí)行對(duì)應(yīng)的目標(biāo)機(jī)器代碼;若查找缺失,則執(zhí)行"由源機(jī)器碼組成的基本塊->由中間指令組成的基本塊->由目標(biāo)機(jī)器代碼組成的基本塊"的基本塊兩次翻譯的過(guò)程,并將結(jié)果存入目標(biāo)代碼緩存中并更新哈希表,然后執(zhí)行翻譯好后的目標(biāo)機(jī)器代碼;(4)在執(zhí)行目標(biāo)代碼的過(guò)程中,不斷的通過(guò)剖分技術(shù)獲取程序執(zhí)行信息, 一旦某個(gè)塊的執(zhí)行次數(shù)大于閾值3000,則執(zhí)行上下文切換操作,回到CrossBit程序中調(diào)用構(gòu)建熱路徑的函數(shù),并翻譯得到超級(jí)塊,將該超級(jí)塊存入目標(biāo)代碼緩存中并更新哈希表;(5)然后開(kāi)始執(zhí)行翻譯好后的超級(jí)塊,當(dāng)執(zhí)行完一個(gè)塊后,通過(guò)塊結(jié)束時(shí)的跳轉(zhuǎn)指令的目的地址重復(fù)(2)至(5)的操作流程。
本發(fā)明將上述流程中的基本塊翻譯和目標(biāo)代碼的執(zhí)行部分作為CrossBit的主線(xiàn)程,而將構(gòu)建熱路徑和翻譯超級(jí)塊部分變?yōu)楠?dú)立的子線(xiàn)程,從而構(gòu)成多線(xiàn)程的動(dòng)態(tài)二進(jìn)制翻譯器系統(tǒng)優(yōu)化架構(gòu),線(xiàn)程的創(chuàng)建和相關(guān)操作用Linux的pthread庫(kù)函數(shù)實(shí)現(xiàn)。如附圖1所示,子線(xiàn)程通過(guò)獲取主線(xiàn)程傳遞來(lái)的熱點(diǎn)入口地址信息啟動(dòng),構(gòu)建完一條熱路徑后并翻譯得到超級(jí)塊,將該超級(jí)塊放入超級(jí)塊目標(biāo)緩存中,并更新全局的哈希表。然后子線(xiàn)程阻塞等待下一個(gè)熱點(diǎn)信息。子線(xiàn)程等待數(shù)據(jù)產(chǎn)生的方式采用輪詢(xún)查找來(lái)實(shí)現(xiàn),因?yàn)檫@種方式對(duì)某一事件發(fā)生具有最快的響應(yīng)效率。
2. 設(shè)計(jì)新的目標(biāo)緩存架構(gòu)
為了防止上述流程(3)中產(chǎn)生的基本塊插入目標(biāo)緩存的操作與流程(4)中產(chǎn)生的超級(jí)塊插入目標(biāo)緩存的操作產(chǎn)生沖突,本發(fā)明采用了雙目標(biāo)代碼緩存架構(gòu)。所謂雙目標(biāo)緩存,就是指設(shè)置兩個(gè)可以存放翻譯好后的目標(biāo)代碼的容器,一個(gè)用來(lái)存放主線(xiàn)程翻譯得到的目標(biāo)代碼基本塊,另一個(gè)用于存放由子線(xiàn)程重構(gòu)熱路徑后得到的目標(biāo)代碼超級(jí)塊,然后通過(guò)全局的哈希表函數(shù)來(lái)控制主線(xiàn)程和子線(xiàn)程對(duì)這兩個(gè)緩存的讀和更新操作。本發(fā)明的哈希表函數(shù)的映射關(guān)系式為取各個(gè)塊入口地址的十六進(jìn)制表示的最后四位數(shù)字來(lái)獲得關(guān)系映射的結(jié)果,如0x40005678在哈希表中的偏移值即為5678,通過(guò)該數(shù)值我們可以在內(nèi)存中唯一的尋址數(shù)據(jù)。本發(fā)明的兩個(gè)目標(biāo)緩存均被聲明為10MB的連續(xù)內(nèi)存空間,這兩部分空間通過(guò)Linux系統(tǒng)調(diào)用mmap ()和庫(kù)函數(shù)malloc ()申請(qǐng)獲得,該內(nèi)存空間具有可讀寫(xiě)、可執(zhí)行的權(quán)限。
3. 指定明確的硬親和力
所謂親和力,即一個(gè)線(xiàn)程更傾向于執(zhí)行的處理器核心的集合。例如,若存在一個(gè)四核處理器P,分別用0, 1, 2, 3來(lái)代表這四個(gè)核的名稱(chēng),若某個(gè)線(xiàn)程的親和力為{0, 1},就是指該線(xiàn)程會(huì)由操作系統(tǒng)隨機(jī)的分配在P的0號(hào)核或1號(hào)核上。硬親和力,就是明確指派線(xiàn)程執(zhí)行在具體的哪一個(gè)處理器核上。本發(fā)明將主線(xiàn)程分配在多核處理器的0號(hào)核上執(zhí)行,將子線(xiàn)程分配在1號(hào)核上執(zhí)行。在Linux系統(tǒng)環(huán)境下,相關(guān)的系統(tǒng)調(diào)用為
int sched一setaffinity (pid_t pid, size_t len, cpu_set_t *mask);
其中,pid參數(shù)為是線(xiàn)程的id號(hào),可以通過(guò)gettid ()系統(tǒng)調(diào)用獲得;len變量為集合的大小,可通過(guò)sizeof (&mask)的操作獲得;mask為指向可能分配的目標(biāo)處理器核的集合的指針。
設(shè)置該集合需要兩個(gè)宏調(diào)用
cpu—set—t mask; //mask為一個(gè)可以放置目標(biāo)核的集合
CPU—ZERO(&mask); 〃該操作將mask集合清空
CPU—SET(0,&mask); 〃該操作將mask集合添加0號(hào)核
4.設(shè)計(jì)新的線(xiàn)程間通信的機(jī)制
根據(jù)附圖1的模型可知,本發(fā)明的系統(tǒng)的主線(xiàn)程和子線(xiàn)程之間的通信手段屬
于生產(chǎn)者和消費(fèi)者的通信模型。常用的處理這種多線(xiàn)程模型的方式為采用二進(jìn)
制信號(hào)量的方法來(lái)解決。大致過(guò)程為(1)設(shè)置初始信號(hào)量3=1, C=0,其中,S
為控制生產(chǎn)者寫(xiě)臨界區(qū)的信號(hào)量,c為啟動(dòng)子線(xiàn)程讀臨界區(qū)的信號(hào)量。(2)當(dāng)生產(chǎn)者產(chǎn)生了一個(gè)數(shù)據(jù)后,生產(chǎn)者對(duì)信號(hào)量s進(jìn)行減l操作,然后進(jìn)入臨界區(qū)。每個(gè)線(xiàn)程中訪(fǎng)問(wèn)臨界資源的那段程序稱(chēng)為臨界區(qū)(Critical Section),臨界資源是指一次僅允許一個(gè)線(xiàn)程使用的共享資源。(3)在臨界區(qū)中,主線(xiàn)程完成對(duì)全局變量的寫(xiě)操作,然后對(duì)信號(hào)量s加一并同時(shí)對(duì)c加一,這時(shí)消費(fèi)者子線(xiàn)程可以對(duì)信號(hào)量c減一進(jìn)入它的臨界區(qū),在這部分臨界區(qū)中完成相應(yīng)的消費(fèi)操作。
這種模型雖然對(duì)于之前提出的系統(tǒng)框架同樣適用,但是并不高效。因?yàn)楸景l(fā)明并沒(méi)有必要在剖分過(guò)程中檢測(cè)到一個(gè)熱點(diǎn)時(shí)就切換上下文回到高級(jí)語(yǔ)言中進(jìn)行信號(hào)量的操作,這部分上下文切換的開(kāi)銷(xiāo)是可以避免的。為此,本發(fā)明采用主線(xiàn)程利用生產(chǎn)者計(jì)數(shù)器作為索引值,在機(jī)器語(yǔ)言級(jí)別對(duì)一段連續(xù)的內(nèi)存空間不斷地壓入熱點(diǎn)的入口地址的同時(shí),子線(xiàn)程利用消費(fèi)者計(jì)數(shù)器作為索引值,在高級(jí)語(yǔ)言級(jí)別不停地從這段連續(xù)的內(nèi)存空間讀取熱點(diǎn)的入口地址的方式,來(lái)完成兩線(xiàn)程間的通信。
具體的實(shí)現(xiàn)方法為
1) 首先,本發(fā)明需要在內(nèi)存中開(kāi)辟一段可讀寫(xiě)操作的連續(xù)的內(nèi)存空間M。這段連續(xù)的空間M用于存放所有熱點(diǎn)的入口地址。
2) 設(shè)置生產(chǎn)者計(jì)數(shù)器producerCount和消費(fèi)者計(jì)數(shù)器consumerCount,分別作為主線(xiàn)程和子線(xiàn)程對(duì)內(nèi)存空間M做讀寫(xiě)操作的索引值,均初始化為0。
3) 將CrossBit插樁(instrumentation)做剖分部分的代碼擴(kuò)充,實(shí)現(xiàn)如下的功能
I. 當(dāng)一個(gè)基本塊執(zhí)行的次數(shù)超過(guò)閾值3000之后,首先判斷該熱點(diǎn)的入口地址是否已經(jīng)被保存在內(nèi)存空間M中,這個(gè)可以通過(guò)對(duì)每個(gè)基本塊增加一個(gè)寫(xiě)入內(nèi)存空間M與否的標(biāo)志位來(lái)實(shí)現(xiàn)。
II. 如果該熱點(diǎn)入口地址沒(méi)有被保存在內(nèi)存空間M中,則首先得到producerCount變量的內(nèi)存地址,通過(guò)訪(fǎng)存指令將producerCount的值移入一個(gè)固定的運(yùn)算寄存器RA和一個(gè)固定的備份寄存器RB中。然后將運(yùn)算寄存器RA左移2位,相當(dāng)于乘以4,因?yàn)橐莆徊僮鞅瘸朔ú僮鞲痈咝В赃@里選擇移位操作。乘以4是因?yàn)槊恳粋€(gè)熱點(diǎn)入口地址是一個(gè)無(wú)符號(hào)整型的變量,如果要保存到內(nèi)存中是需要4個(gè)字節(jié)空間的。將運(yùn)算得到的寄存器RA中的值與M的首地址相加,就得到了寫(xiě)入這段內(nèi)存空間M的具體的內(nèi)存位置,然后執(zhí)行mov操作,把這個(gè)熱點(diǎn)的入口地址保存到該位置。
III. 最后,取出備份寄存器RB中的值,把RB加1后將其值寫(xiě)回到生產(chǎn)者計(jì)數(shù)器producerCount的內(nèi)存地址中去,完成對(duì)producerCount的加1操作,以便再次寫(xiě)入時(shí),寫(xiě)入地址對(duì)應(yīng)著內(nèi)存空間M的下一個(gè)存放入口地址的位置。
4) 在構(gòu)建超級(jí)塊的子線(xiàn)程中,該線(xiàn)程首先讀取生產(chǎn)者計(jì)數(shù)器producerCount的值,然后和消費(fèi)者計(jì)數(shù)器consumerCcmnt做比較,如果兩個(gè)值不相等的話(huà),就說(shuō)明主線(xiàn)程已經(jīng)修改了 producerCount的值。由于子線(xiàn)程在高級(jí)語(yǔ)言中實(shí)現(xiàn),可以直接通過(guò)高級(jí)語(yǔ)言的尋址操作,首先得到該連續(xù)內(nèi)存的首地址并賦給一個(gè)指針變量pM,然后通過(guò)氣pM+consumerCount)的操作即可獲得一個(gè)熱點(diǎn)的地址值。通過(guò)這個(gè)輸入來(lái)啟動(dòng)子線(xiàn)程開(kāi)始工作,構(gòu)建熱路徑并翻譯超級(jí)塊,接著完成更新哈希表操作。最后對(duì)consumerCount進(jìn)行加1操作,并與producerCount再次比較,如果仍然小于它,則繼續(xù)讀內(nèi)存M中下一個(gè)入口地址的值并再次構(gòu)建新的超級(jí)塊。如果相等,則采取輪詢(xún)等待的方式繼續(xù)等待生產(chǎn)者計(jì)數(shù)器的改變。
權(quán)利要求
1、一種動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法,其特征在于包括如下步驟1)將基本塊翻譯和目標(biāo)代碼的執(zhí)行部分作為主線(xiàn)程,將構(gòu)建熱路徑和翻譯超級(jí)塊部分作為子線(xiàn)程,主線(xiàn)程和子線(xiàn)程并行工作,構(gòu)成多線(xiàn)程的動(dòng)態(tài)二進(jìn)制翻譯器系統(tǒng)優(yōu)化架構(gòu);2)采用雙目標(biāo)代碼緩存架構(gòu),一個(gè)緩存用于存放主線(xiàn)程翻譯得到的目標(biāo)代碼基本塊,另一個(gè)緩存用于存放由子線(xiàn)程重構(gòu)熱路徑后得到的目標(biāo)代碼超級(jí)塊,然后通過(guò)全局的哈希表函數(shù)來(lái)控制主線(xiàn)程和子線(xiàn)程對(duì)這兩個(gè)緩存的讀和更新操作;3)使用硬親和力將主線(xiàn)程分配在多核處理器的0號(hào)核上執(zhí)行,將子線(xiàn)程分配在1號(hào)核上執(zhí)行;4)主線(xiàn)程利用生產(chǎn)者計(jì)數(shù)器作為索引值,在機(jī)器語(yǔ)言級(jí)別對(duì)一段連續(xù)的內(nèi)存空間不斷地壓入熱點(diǎn)的入口地址,子線(xiàn)程利用消費(fèi)者計(jì)數(shù)器作為索引值,在高級(jí)語(yǔ)言級(jí)別不停地從這段連續(xù)的內(nèi)存空間去讀取熱點(diǎn)的入口地址,完成兩線(xiàn)程間的通信。
全文摘要
本發(fā)明提出了一種動(dòng)態(tài)二進(jìn)制翻譯器中熱路徑的多核多線(xiàn)程構(gòu)建方法。本發(fā)明首先將基本塊翻譯和目標(biāo)代碼的執(zhí)行部分作為主線(xiàn)程,將構(gòu)建熱路徑和翻譯超級(jí)塊部分作為子線(xiàn)程,變通用的動(dòng)態(tài)二進(jìn)制翻譯器中獨(dú)立的代碼緩存結(jié)構(gòu)為雙代碼緩存的設(shè)計(jì)方式,利用哈希表函數(shù)統(tǒng)一管理這兩個(gè)代碼緩存,使主線(xiàn)程和子線(xiàn)程在數(shù)據(jù)查詢(xún)和更新過(guò)程中可以并行進(jìn)行,然后結(jié)合硬親和力指定主線(xiàn)程和子線(xiàn)程工作在多核處理器的不同核上,并用連續(xù)的一段內(nèi)存空間和兩個(gè)計(jì)數(shù)器來(lái)模擬一段隊(duì)列,在機(jī)器語(yǔ)言級(jí)和高級(jí)語(yǔ)言級(jí)進(jìn)行兩線(xiàn)程間的通信。本發(fā)明具有高并行性和低同步開(kāi)銷(xiāo)的優(yōu)良特質(zhì),為今后動(dòng)態(tài)二進(jìn)制翻譯器的優(yōu)化工作提供了新的思路和新的框架。
文檔編號(hào)G06F9/45GK101477472SQ200910045058
公開(kāi)日2009年7月8日 申請(qǐng)日期2009年1月8日 優(yōu)先權(quán)日2009年1月8日
發(fā)明者李曉龍, 梁阿磊, 管海兵, 鄭德恩, 顧靜輝 申請(qǐng)人:上海交通大學(xué)