本發(fā)明是一種GPU L1 Cache處訪存序列的仿真生成與排序方法,屬于計(jì)算機(jī)體系結(jié)構(gòu)和并行計(jì)算領(lǐng)域。
背景技術(shù):
近十年來(lái),GPU從專用圖形處理器逐漸發(fā)展成通用計(jì)算平臺(tái),憑借其強(qiáng)大的并行計(jì)算能力和功耗控制能力,GPU通用計(jì)算在科學(xué)計(jì)算領(lǐng)域得到了廣泛的應(yīng)用和關(guān)注。由于GPU芯片將大部分面積都分配給計(jì)算單元,僅分配少量芯片面積給Cache和控制單元,大量GPU應(yīng)用程序的性能受限于GPU的訪存速度,而非計(jì)算能力。對(duì)于GPU訪存限制型應(yīng)用程序,Cache使用效率對(duì)程序整體性能影響顯著,優(yōu)化Cache使用效率以提高整體性能是一種重要的手段。為了幫助程序開發(fā)者理解GPU Cache行為特征,選擇恰當(dāng)?shù)腃ache優(yōu)化方法,準(zhǔn)確性高、速度快、功能全的GPU Cache缺失分析工具就顯得的尤為重要。
現(xiàn)有的GPU Cache缺失分析工具依據(jù)其采集信息的原理可以分為三類:基于硬件計(jì)數(shù)器、基于時(shí)鐘精確模擬器和基于訪存序列分析?;谟布洈?shù)器的工具運(yùn)行速度最快,但它依賴于實(shí)體的GPU硬件,并且提供的信息十分有限,不具備擴(kuò)展性;基于時(shí)鐘精確模擬器的方法提供的信息量大,抓取信息最為方便,但運(yùn)行的時(shí)間開銷過(guò)于龐大,并且其支持的GPU微結(jié)構(gòu)體系十分有限;基于訪存序列分析的方法結(jié)合了前兩種方法的長(zhǎng)處:不僅提供足夠的信息量,具備多種架構(gòu)適應(yīng)性,并且將時(shí)間開銷控制在可以接受的范圍內(nèi)。
在GPU體系結(jié)構(gòu)中,L1 Cache被SM中同時(shí)運(yùn)行的幾十甚至幾百個(gè)線程共享,給基于訪存序列的GPU L1 Cache缺失行為的分析造成困難。我們不僅需要獲取SM中各線程有序的訪存序列,還必須獲取來(lái)自不同線程的訪存請(qǐng)求到達(dá)L1 Cache的先后順序。然而,目前尚無(wú)有效方法準(zhǔn)確地從硬件計(jì)數(shù)器,或是仿真環(huán)境中獲取以上信息。
技術(shù)實(shí)現(xiàn)要素:
發(fā)明目的:針對(duì)上述現(xiàn)有技術(shù)存在的問(wèn)題和不足,本發(fā)明的目的是提出一種GPU L1 Cache處訪存序列的仿真生成與排序方法,準(zhǔn)確提供各線程訪存請(qǐng)求到達(dá)L1 Cache的先后順序以及各線程有序的訪存序列,為基于訪存序列的GPU L1 Cache缺失分析和優(yōu)化提供基礎(chǔ),充分發(fā)揮GPU L1 Cache和整個(gè)訪存系統(tǒng)的性能。
技術(shù)方案:為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明采用的技術(shù)方案為GPU L1 Cache處訪存序列的仿真生成與排序方法,該訪存序列是指一個(gè)線程從開始執(zhí)行到結(jié)束執(zhí)行對(duì)全局存儲(chǔ)按順序發(fā)生的所有訪存請(qǐng)求的記錄,每一次訪存請(qǐng)求的記錄包含以下信息:
線程id:發(fā)出該訪存請(qǐng)求的線程id;
PC值:發(fā)出該訪存請(qǐng)求的訪存指令的程序計(jì)數(shù)器值;
訪存地址:訪存請(qǐng)求的數(shù)據(jù)所在地址;
數(shù)據(jù)寬度:訪存請(qǐng)求的數(shù)據(jù)寬度,以字節(jié)為單位;
數(shù)據(jù)依賴性標(biāo)志:取值為0或1,表示下一條訪存請(qǐng)求之前,當(dāng)前訪存請(qǐng)求的數(shù)據(jù)是否會(huì)被其它指令使用到;
其中,數(shù)據(jù)依賴標(biāo)志與PC值匹配,同一個(gè)PC值下所有訪存請(qǐng)求具有相同的數(shù)據(jù)依賴標(biāo)志;
具體包括以下步驟:
1a)訪存序列生成:使用GPU功能模擬器提供的接口,編寫序列生成器,在模擬器上運(yùn)行GPU程序時(shí),序列生成器自動(dòng)抓取各線程發(fā)出的訪存請(qǐng)求信息,并存儲(chǔ)為各線程初始的訪存序列;
1b)線程調(diào)度:將一定數(shù)量的相鄰的線程劃分到同一個(gè)線程束中,根據(jù)應(yīng)用程序線程塊的維度設(shè)置,將一定數(shù)量相鄰的線程束劃分到同一個(gè)線程塊中,再根據(jù)每個(gè)流多處理器上能夠同時(shí)運(yùn)行的最大線程塊數(shù)量限制,依次將各個(gè)線程塊分配到流多處理器;將位于同一流多處理器中的各線程初始的訪存序列劃分到一個(gè)任務(wù)組中;
1c)訪存合并:在同一個(gè)線程束中,執(zhí)行同一條訪存指令的多個(gè)線程發(fā)出的所有訪存請(qǐng)求中,根據(jù)訪存請(qǐng)求的數(shù)據(jù)寬度和各訪存請(qǐng)求的訪存地址分布進(jìn)行訪存合并,生成一個(gè)新的訪存請(qǐng)求,并相應(yīng)獲得該線程束內(nèi)合并后的有序的訪存序列;
1d)訪存排序,在每個(gè)任務(wù)組內(nèi),按照來(lái)自不同線程的訪存請(qǐng)求到達(dá)L1Cache的先后順序,將任務(wù)組內(nèi)各線程有序的訪存序列合并成一個(gè)該任務(wù)組總的有序訪存序列。
進(jìn)一步的,在步驟1c)中,根據(jù)訪存請(qǐng)求的數(shù)據(jù)寬度進(jìn)行訪存合并,若當(dāng)訪存請(qǐng)求4個(gè)字節(jié)的數(shù)據(jù)時(shí),在整個(gè)線程束32個(gè)線程范圍內(nèi)進(jìn)行訪存合并;若當(dāng)訪存請(qǐng)求8個(gè)字節(jié)或16個(gè)字節(jié)的數(shù)據(jù)時(shí),則分別以半個(gè)線程束即16個(gè)線程或四分之一個(gè)線程束即8個(gè)線程范圍內(nèi)進(jìn)行訪存合并,并以此類推。
進(jìn)一步的,在步驟1c)中,根據(jù)各線程訪存請(qǐng)求的訪存地址分布進(jìn)行訪存合并,其條件為:緩存行地址相同的訪存請(qǐng)求才能夠進(jìn)行合并,緩存行地址=訪存地址/緩存行大小。
進(jìn)一步的,所述步驟1c)所述的訪存合并包括下面4個(gè)子步驟:
4a)創(chuàng)建一個(gè)用于存儲(chǔ)合并后的有序訪存請(qǐng)求集合,并初始化該集合為空;創(chuàng)建一個(gè)待合并訪存請(qǐng)求集合,將同一個(gè)線程束內(nèi)執(zhí)行同一條訪存指令的多個(gè)線程發(fā)出的所有訪存請(qǐng)求存入其中,完成初始化;
4b)從待合并訪存請(qǐng)求集合中取出一個(gè)訪存請(qǐng)求,并由該訪存請(qǐng)求的訪存地址計(jì)算訪存請(qǐng)求的緩存行地址;
4c)判斷步驟4a)創(chuàng)建的合并后有序訪存請(qǐng)求集合中是否存在與當(dāng)前訪存請(qǐng)求的緩存行地址相同的訪存請(qǐng)求;若不存在,則把當(dāng)前訪存請(qǐng)求加入合并后有序訪存請(qǐng)求集合中,并將其從待合并訪存請(qǐng)求集合中剔除;若存在,則將合并后有序訪存請(qǐng)求集合中同緩存行地址的原有訪存請(qǐng)求以及當(dāng)前訪存請(qǐng)求合并,生成新的訪存請(qǐng)求,獲得對(duì)應(yīng)的訪存序列信息如下:取與合并前一致的PC值和數(shù)據(jù)依賴性標(biāo)志,取被合并兩個(gè)訪存請(qǐng)求中較小的線程id和對(duì)應(yīng)的訪存地址,取能夠覆蓋被合并兩個(gè)訪存請(qǐng)求所有訪問(wèn)數(shù)據(jù)的最小數(shù)據(jù)寬度,后將該被合并的當(dāng)前訪存請(qǐng)求從待合并訪存請(qǐng)求集合中剔除;
4d)如待合并訪存請(qǐng)求集合中所有訪存請(qǐng)求全部處理完畢,則合并后有序訪存請(qǐng)求集合中的訪存序列即為合并后的訪存請(qǐng)求所組成的有序訪存序列,如待合并訪存請(qǐng)求集合中的訪存請(qǐng)求未全部處理完畢,回到步驟4b)執(zhí)行。
進(jìn)一步的,步驟1d)中,根據(jù)線程調(diào)度原則,通過(guò)循環(huán)體對(duì)同一任務(wù)組內(nèi)多個(gè)線程束的訪存請(qǐng)求到達(dá)L1Cache的先后順序排序,所述循環(huán)體算法為:某一個(gè)線程執(zhí)行完一條指令后,直接跳轉(zhuǎn)到由線程調(diào)度原則決定的下一個(gè)可用的線程取下一個(gè)訪存請(qǐng)求,輪轉(zhuǎn)到最后一個(gè)線程后即跳轉(zhuǎn)回第一個(gè)線程,形成循環(huán)。
進(jìn)一步的,步驟1d)所述的訪存排序包括下面6個(gè)子步驟:
6a)考慮到線程阻塞會(huì)影響到訪存請(qǐng)求到達(dá)L1Cache順序,創(chuàng)建一個(gè)線程阻塞標(biāo)志數(shù)組,記錄每一個(gè)線程id的阻塞標(biāo)志,初始化所有線程id為未被阻塞狀態(tài),設(shè)阻塞標(biāo)志為0;考慮到訪存排序受線程阻塞和指令阻塞影響,創(chuàng)建一個(gè)延時(shí)未結(jié)束訪存請(qǐng)求集合,初始化為空;創(chuàng)建一個(gè)用于存放由排序后訪存記錄所組成的訪存序列集合,初始化為空;
6b)根據(jù)線程調(diào)度原則,從一個(gè)任務(wù)組內(nèi)多個(gè)線程中挑選出一個(gè)阻塞標(biāo)志為0的線程,并取出該線程訪存序列中的一個(gè)訪存請(qǐng)求;
6c)檢查延時(shí)未結(jié)束訪存請(qǐng)求集合,如果為空,跳過(guò)6c)步驟,直接進(jìn)入步驟6d)執(zhí)行;否則,將非空延時(shí)未結(jié)束訪存請(qǐng)求集合中所有訪存請(qǐng)求的訪存延時(shí)減1,并剔除該集合中所有延時(shí)已減至0的訪存請(qǐng)求,同時(shí)更新數(shù)組中這些訪存請(qǐng)求對(duì)應(yīng)線程的阻塞標(biāo)志為0;
6d)判斷存取單元是否忙碌,即,如果延時(shí)未結(jié)束訪存請(qǐng)求集合中訪存請(qǐng)求數(shù)量達(dá)到GPU存取單元容量上限,則存取單元忙碌,回到步驟6c)執(zhí)行;否則,存取單元不忙碌,進(jìn)入步驟6e)執(zhí)行;
6e)將步驟6b)中取出的訪存請(qǐng)求添加到排序后的訪存序列集合;將該訪存請(qǐng)求加入延時(shí)未結(jié)束訪存請(qǐng)求集合中,依據(jù)訪存延時(shí)分布規(guī)律為其生成一個(gè)初始的訪存延時(shí)值;對(duì)于該訪存請(qǐng)求,若其數(shù)據(jù)依賴性標(biāo)志為1,就將數(shù)組中當(dāng)前訪存請(qǐng)求所處線程的阻塞標(biāo)志設(shè)為1,反之,其數(shù)據(jù)依賴性標(biāo)志為0,就將數(shù)組中當(dāng)前訪存請(qǐng)求所處線程的阻塞標(biāo)志設(shè)為0;
6f)若任務(wù)組內(nèi)所有線程的訪存請(qǐng)求處理完畢,則得到該任務(wù)組內(nèi)排序后的訪存序列集合;否則回到步驟6b)執(zhí)行。
進(jìn)一步的,步驟6e)中,訪存延時(shí)分布規(guī)律采用均值為0、標(biāo)準(zhǔn)差為σ的正態(tài)分布模型N(0,σ)產(chǎn)生隨機(jī)數(shù)來(lái)模型訪存延時(shí)。
進(jìn)一步的,步驟6e)中所述的訪存延時(shí)分布,任何訪存延時(shí)分布都適用。
進(jìn)一步的,步驟6b)中所述的線程調(diào)度原則,任何調(diào)度原則都適用。
有益效果:本發(fā)明所述的GPU L1 Cache處訪存序列的仿真生成與排序方法,使用GPU功能模擬器生成GPU應(yīng)用程序各線程初始的訪存序列,在充分解析GPU訪存系統(tǒng)微結(jié)構(gòu)特征后,對(duì)該訪存序列采取線程調(diào)度、訪存合并和訪存排序三大步驟,最終得到GPU應(yīng)用程序在GPU L1 Cache處的仿真訪存序列。該訪存序列便于進(jìn)行GPU L1 Cache缺失行為特征分析。本發(fā)明所述的GPU L1 Cache處訪存序列的仿真生成與排序方法考慮了線程調(diào)度算法、訪存延時(shí)造成的線程阻塞和存取單元忙碌造成的指令阻塞三個(gè)因素對(duì)線程執(zhí)行進(jìn)度的影響,因此,本發(fā)明輸出的GPU L1 Cache處訪存序列接近GPU硬件中的真實(shí)情況,準(zhǔn)確度高。
附圖說(shuō)明
附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,并且構(gòu)成說(shuō)明書的一部分,與本發(fā)明的實(shí)施例一起用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的限制。在附圖中:
圖1為本發(fā)明的實(shí)施例的總體工作流程;
圖2為本發(fā)明的實(shí)施例中各線程有序的訪存序列仿真生成流程;
圖3為本發(fā)明的實(shí)施例中訪存合并的工作流程;
圖4為本發(fā)明的實(shí)施例中使用的循環(huán)體線程調(diào)度算法;
圖5為本發(fā)明的實(shí)施例中訪存序列排序的工作流程。
具體實(shí)施方式
下面結(jié)合附圖及在英偉達(dá)GPU下的實(shí)施例對(duì)本文發(fā)明進(jìn)一步詳細(xì)說(shuō)明。
如圖1所示,本發(fā)明實(shí)施例包含訪存序列生成、線程調(diào)度、訪存合并和訪存排序共四個(gè)步驟。
步驟一,訪存序列生成:訪存序列是指一個(gè)程序從開始執(zhí)行到結(jié)束執(zhí)行對(duì)全局存儲(chǔ)的所有訪問(wèn)記錄,訪存記錄以訪存指令執(zhí)行的先后排序。每條訪存記錄包含了一個(gè)線程一次訪存請(qǐng)求的相關(guān)信息,包括發(fā)起訪存請(qǐng)求的線程id、訪存指令的PC值、訪存地址、訪存請(qǐng)求的數(shù)據(jù)寬度和數(shù)據(jù)依賴性標(biāo)志。序列生成器生成的各線程有序的訪存序列中,同一個(gè)線程訪存序列中訪存請(qǐng)求出現(xiàn)的先后位置與訪存請(qǐng)求到達(dá)L1Cache的先后順序相一致,但是來(lái)自不同線程的訪存請(qǐng)求到達(dá)L1Cache的先后順序不確定。
步驟二,線程調(diào)度:線程調(diào)度具體分為三個(gè)層次:首先,將所有相鄰的32個(gè)線程劃分到同一個(gè)線程束warp中,以英偉達(dá)GPU為例,每個(gè)線程束warp包含32個(gè)線程;然后,根據(jù)應(yīng)用程序線程塊Thread Block的維度設(shè)置,將一定數(shù)量相鄰的線程束Warp劃分到同一個(gè)線程塊Thread Block中;最后,再根據(jù)每個(gè)流多處理器SM上能夠同時(shí)運(yùn)行的最大線程塊Thread Block數(shù)量限制,依次將各個(gè)線程分配到多個(gè)流多處理器上。具體的計(jì)算公式如下所示:其中,thread_id表示線程編號(hào),warp_id表示線程束編號(hào),block_id表示線程塊編號(hào),sm_id表示流多處理器編號(hào),num_warps_per_block表示單個(gè)線程塊Thread BLock內(nèi)最大線程束Warp數(shù)量,num_blocks_per_sm表示單個(gè)流多處理器SM上能夠同時(shí)運(yùn)行的最大線程塊Thread Block數(shù)量。其中,warp_id,block_id,以及sm_id的計(jì)算公式如下:
warp_id=thread_id/32
block_id=warp_id/num_warps_per_block
sm_id=block_id%num_blocks_per_sm
步驟三,訪存合并:在一個(gè)線程束Warp內(nèi)執(zhí)行同一條訪存指令的多個(gè)線程(通常是32個(gè)線程)發(fā)出的多個(gè)訪存請(qǐng)求中,根據(jù)訪存請(qǐng)求的數(shù)據(jù)寬度和各線程訪存請(qǐng)求的地址分布不同進(jìn)行訪存合并。數(shù)據(jù)寬度方面,當(dāng)訪存請(qǐng)求4個(gè)字節(jié)的數(shù)據(jù)時(shí),在整個(gè)線程束32個(gè)線程范圍內(nèi)進(jìn)行訪存合并;當(dāng)訪存請(qǐng)求8個(gè)字節(jié)或16個(gè)字節(jié)的數(shù)據(jù)時(shí),則分別以半個(gè)線程束即16個(gè)線程或四分之一個(gè)線程束即8個(gè)線程范圍內(nèi)進(jìn)行訪存合并。線程訪存地址分布方面,只有分配到同一緩存行,即緩存行地址相同的訪存請(qǐng)求才能夠進(jìn)行合并,緩存行地址不同的訪存請(qǐng)求無(wú)法合并。
步驟四,訪存排序:本發(fā)明的實(shí)施例中,通過(guò)一個(gè)循環(huán)體實(shí)現(xiàn)對(duì)同一任務(wù)組內(nèi)多個(gè)線程束warp的訪存序列按照訪存請(qǐng)求抵達(dá)GPU L1 Cache的先后次序排序。循環(huán)體每執(zhí)行一次,從各線程有序的訪存序列中挑選出下一個(gè)要處理的訪存請(qǐng)求,將該訪存請(qǐng)求插入到排好序的訪存序列中。各線程有序的訪存序列中所有訪存請(qǐng)求處理完畢后,就得到GPU L1 Cache處總的有序訪存序列。
圖2為本發(fā)明的實(shí)施例中訪存序列生成器的執(zhí)行流程。GPU功能模擬器使用的是由美國(guó)佐治亞理工學(xué)院計(jì)算機(jī)架構(gòu)和系統(tǒng)實(shí)驗(yàn)室開發(fā)的一款用于英偉達(dá)GPU的模擬器Ocelot。Ocelot模擬器提供了專門用于訪存序列生成的接口。具體的執(zhí)行流程如下:首先,GPU應(yīng)用程序開始執(zhí)行之前,在序列生成器內(nèi)注冊(cè)生成器,通知Ocelot模擬器在特定事件觸發(fā)后調(diào)用序列生成器內(nèi)提供的事件處理函數(shù);然后,開始執(zhí)行GPU應(yīng)用程序,其中的串行代碼仍然在宿主CPU處理器上運(yùn)行,但并行代碼不是運(yùn)行于GPU硬件,而是模擬執(zhí)行于Ocelot模擬器。Ocelot模擬器每執(zhí)行一條PTX匯編指令,都會(huì)觸發(fā)一次事件,序列生成器內(nèi)的事件處理函數(shù)負(fù)責(zé)采集各次訪存信息,并將生成的訪存序列在恰當(dāng)?shù)臅r(shí)間寫入指定的文件中;最后,Ocelot模擬執(zhí)行完所有并行Kernel,將執(zhí)行權(quán)交回給串行程序,并最終結(jié)束整個(gè)訪存序列生成流程。
圖3為本發(fā)明的實(shí)施例中訪存合并方法執(zhí)行流程,具體分為4個(gè)步驟。一、創(chuàng)建一個(gè)空的集合,用于存儲(chǔ)合并后的訪存請(qǐng)求;二、從合并前的多個(gè)訪存請(qǐng)求中取出一個(gè)訪存請(qǐng)求,并計(jì)算它請(qǐng)求的緩存行地址;三、判斷步驟一創(chuàng)建的集合中是否存在一個(gè)訪存請(qǐng)求,它請(qǐng)求的緩存行地址與當(dāng)前訪存請(qǐng)求相同。如果不存在,則把當(dāng)前訪存請(qǐng)求存入集合中;如果存在,則合并原有訪存請(qǐng)求和當(dāng)前訪存請(qǐng)求生成新的訪存請(qǐng)求。四、如果合并前的訪存請(qǐng)求全部處理完畢,則生成了合并后的訪存請(qǐng)求集合,結(jié)束該執(zhí)行流程,否則回到以上步驟二執(zhí)行。
圖4展示了本發(fā)明的實(shí)施例中訪存排序所使用的循環(huán)體Round Robin線程調(diào)度算法。循環(huán)體Round Robin算法的基本原則為:某一個(gè)線程執(zhí)行完一條指令后,立即依次跳轉(zhuǎn)到下一個(gè)處于就緒狀態(tài)的線程,而不會(huì)在一個(gè)線程上連續(xù)停留執(zhí)行多條指令。基于循環(huán)體Round Robin算法從訪存序列中挑選訪存請(qǐng)求的具體方法是:從某線程取走一個(gè)訪存請(qǐng)求后,立即跳轉(zhuǎn)到下一個(gè)可用的線程取下一個(gè)訪存請(qǐng)求,而不會(huì)在同一個(gè)線程的訪存序列中停留或連續(xù)取兩個(gè)訪存請(qǐng)求,輪轉(zhuǎn)到最后一個(gè)線程后即跳轉(zhuǎn)回第一個(gè)線程,形成循環(huán)。以上過(guò)程如圖4所示。基于循環(huán)體Round Robin線程調(diào)度算法保證了各個(gè)線程的訪存請(qǐng)求被選取的進(jìn)度基本是一致的,并與英偉達(dá)GPU硬件架構(gòu)中的線程束調(diào)度算法相一致。
圖5為本發(fā)明的實(shí)施例中訪存序列排序的工作流程圖。除了循環(huán)體Round Robin線程調(diào)度算法外,本發(fā)明還考慮了訪存延時(shí)造成的線程阻塞和存取單元忙碌造成的指令阻塞的影響。
訪存延時(shí)造成的線程阻塞方面,英偉達(dá)GPU中,當(dāng)一個(gè)線程發(fā)射出一條訪存指令后,在訪存數(shù)據(jù)返回之前,后續(xù)的指令可能會(huì)處于等待訪存數(shù)據(jù)的狀態(tài)而無(wú)法繼續(xù)執(zhí)行,因而后續(xù)的訪存指令也無(wú)法順利發(fā)出。后續(xù)的指令能否繼續(xù)發(fā)射取決于后續(xù)指令的是否依賴于當(dāng)前訪存所請(qǐng)求的數(shù)據(jù),如果有依賴,則后續(xù)指令會(huì)阻塞;如果沒(méi)有依賴,則后續(xù)指令就不會(huì)阻塞。在本發(fā)明的實(shí)施例中,一個(gè)線程的某條訪存請(qǐng)求被取出后,即根據(jù)訪存序列中的線程阻塞信息選擇性地將線程標(biāo)記為阻塞狀態(tài),在阻塞狀態(tài)下,該線程的后續(xù)訪存請(qǐng)求不能被取出。直到前一條訪存請(qǐng)求的數(shù)據(jù)返回,阻塞狀態(tài)解除,該線程后續(xù)訪存請(qǐng)求才能繼續(xù)被取出。
存取單元造成的指令阻塞方面,英偉達(dá)GPU中,使用MSHR寄存器記錄正在缺失中的訪存請(qǐng)求信息,記錄的信息包括失效地址和訪存請(qǐng)求的來(lái)源信息。當(dāng)MSHR寄存器溢出(MSHR寄存器被占滿)時(shí),新的訪存請(qǐng)求將無(wú)法成功發(fā)出,相應(yīng)的指令發(fā)射失??;發(fā)射失敗的指令將反復(fù)嘗試發(fā)射,直到MSHR寄存器出現(xiàn)空閑。在本發(fā)明的實(shí)施例中,當(dāng)檢查到存取單元忙碌,即MSHR寄存器溢出時(shí),會(huì)暫停對(duì)訪存請(qǐng)求的排序,一直等到某些訪存請(qǐng)求延時(shí)結(jié)束,數(shù)據(jù)末返回的訪存請(qǐng)求數(shù)量小于MSHR寄存器總個(gè)數(shù),即MSHR寄存器出現(xiàn)空閑,再繼續(xù)訪存請(qǐng)求的排序,如圖5所示。
由于各次訪存的準(zhǔn)確延時(shí)無(wú)法確定,本發(fā)明的實(shí)施例采用正態(tài)分布模型產(chǎn)生隨機(jī)數(shù)來(lái)模型訪存延時(shí)。具體的計(jì)算公式如下所示:其中,N(0,σ)表示均值為0、標(biāo)準(zhǔn)差為σ的正態(tài)分布,abs是求絕對(duì)值函數(shù),M是延時(shí)最小值,σ和M的值依據(jù)實(shí)驗(yàn)數(shù)據(jù)估計(jì);T是最終分配的“訪存延時(shí)”,T并不是以時(shí)間為單位的實(shí)際延時(shí)值,而是訪存數(shù)據(jù)到達(dá)處理器之前還可以發(fā)射其它線程的訪存?zhèn)€數(shù)。
T=M+abs(N(0,σ))
最后應(yīng)說(shuō)明的是:以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。