一種數(shù)據(jù)處理方法及處理器的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機(jī)領(lǐng)域,尤其涉及一種數(shù)據(jù)處理方法及處理器。
【背景技術(shù)】
[0002]最近幾年內(nèi),處理器廠商受到功耗和溫度的限制,同時為了保持高性能運(yùn)算持續(xù)增長,計算機(jī)已經(jīng)朝著多核計算機(jī)體系架構(gòu)方向發(fā)展。為了充分利用多核架構(gòu),應(yīng)用程序被拆分成多個可獨(dú)立運(yùn)行在單個CPU上面的線程,這樣設(shè)計程序可以并行執(zhí)行提高整體運(yùn)行效率。
[0003]當(dāng)前多核體系架構(gòu)的主流設(shè)計方案的一個例子如圖1a和圖1b所示,圖1a中共有16個CPU核,彼此通過路由(圖中粗線)可相互訪問,圖1b中是每個處理器的框架,其中*Ln代表 First Level Cache (第一級緩存)L1,或者 LI 及 Second Level Cache (第二級緩存)L2 ;Last Level Cache為最后一級緩存,簡稱LLC,*Ln分別和LLC及路由相連,LLC的目錄和路由相連。當(dāng)從內(nèi)存中讀出內(nèi)存數(shù)據(jù)后會將內(nèi)存數(shù)據(jù)均勻分?jǐn)偟矫總€處理器的LLC。
[0004]基于這樣的程序體系,需要保證數(shù)據(jù)處理的同步性和數(shù)據(jù)完整性,因此線程之間需要用某種同步機(jī)制來串行訪問共享區(qū)域。Transact1n memory (事務(wù)內(nèi)存)的提出正是為了提高線程的并行度,同時在發(fā)生沖突能夠進(jìn)行回滾到發(fā)生沖突之前的狀態(tài),保證了數(shù)據(jù)完整性。當(dāng)前Transact1n memory技術(shù)已經(jīng)進(jìn)入了 CPU體系架構(gòu)之中,包括IBM的BlueGen, Intel 的 Haswell 等。
[0005]經(jīng)過將近20多年的發(fā)展,Transact1n memory可以分別由軟件或者硬件實現(xiàn),軟件實現(xiàn)的Transact1n memory執(zhí)行效率非常低,而硬件實現(xiàn)的Transact1n memory大大提高了其實用性,本文主要討論硬件基礎(chǔ)上的Transact1n memory。
[0006]Transact1n memory假設(shè)多核線程之間對于共享數(shù)據(jù)的訪問很少產(chǎn)生寫-讀,讀-寫,以及寫-寫沖突,因此允許多個線程試探性的并行執(zhí)行,通過隱藏數(shù)據(jù)的更新狀態(tài)以及當(dāng)發(fā)現(xiàn)產(chǎn)生沖突的時候進(jìn)行回滾,使程序的狀態(tài)能回到?jīng)_突之前的狀態(tài),利用這個特性在不影響數(shù)據(jù)完整性的前提下提高了體系結(jié)構(gòu)的性能和可擴(kuò)展性。雖然Transact1nmemory提高了多核系統(tǒng)的并行度,但隨著并行度的提高沖突產(chǎn)生的概率也隨之增加,一旦產(chǎn)生沖突進(jìn)行回滾操作就會嚴(yán)重的傷害程序的性能。
[0007]如果采用提前無效化處理,能夠加快關(guān)鍵區(qū)域的運(yùn)行,大大減少由于對共享數(shù)據(jù)進(jìn)行更新時產(chǎn)生的沖突。但如果直接將提前無效化處理應(yīng)用到現(xiàn)有的Transact1nmemory技術(shù)中,由于提前無效化處理要求改變?nèi)謹(jǐn)?shù)據(jù)狀態(tài),與Transact1n Memory實現(xiàn)的方式截然相反(Transact1n Memory處理過程必須隱藏更新時的狀態(tài)),因此不能與Transact1n memory 簡單結(jié)合。
【發(fā)明內(nèi)容】
[0008]本申請要解決的技術(shù)問題是如何減少多核系統(tǒng)中由于數(shù)據(jù)沖突產(chǎn)生的回滾事件,加速關(guān)鍵區(qū)域的運(yùn)行。
[0009]為了解決上述問題,本申請?zhí)峁┝艘环N數(shù)據(jù)處理方法,包括:
[0010]第一處理器開始事務(wù)處理,將第一數(shù)據(jù)讀取到私有緩存中;
[0011]第一處理器在私有緩存中對所述第一數(shù)據(jù)進(jìn)行寫操作,完成后開始提交事務(wù)內(nèi)存;
[0012]如果所述第一數(shù)據(jù)在被第一處理器寫操作前的最后一次更改是由第二處理器進(jìn)行的,則將所述第一處理器的私有緩存中的所述第一數(shù)據(jù)寫到最后一級緩存LLC中,無效化所述第一處理器的私有緩存中的所述第一數(shù)據(jù);
[0013]事務(wù)內(nèi)存完成提交。
[0014]進(jìn)一步地,所述方法還包括:
[0015]當(dāng)所述第一處理器將在私有緩存中對所述第一數(shù)據(jù)進(jìn)行寫操作時,如果所述第一數(shù)據(jù)在被第一處理器寫操作前的最后一次更改是由第二處理器進(jìn)行的,則將所述私有緩存中的所述第一數(shù)據(jù)的狀態(tài)修改為獨(dú)占且更改;如果所述第一數(shù)據(jù)在被第一處理器寫操作前的最后一次更改是由第一處理器進(jìn)行的,則將所述私有緩存中的所述第一數(shù)據(jù)的狀態(tài)修改為更改;
[0016]所述開始提交事務(wù)內(nèi)存的步驟后、事務(wù)內(nèi)存完成提交的步驟前還包括:
[0017]如果所述第一處理器的私有緩存中的所述第一數(shù)據(jù)的狀態(tài)為獨(dú)占且更改,則將所述第一數(shù)據(jù)在LLC目錄中的狀態(tài)設(shè)置為獨(dú)占且更改。
[0018]進(jìn)一步地,所述第一處理器開始事務(wù)處理,將第一數(shù)據(jù)讀取到私有緩存中的步驟包括:
[0019]S11、第一處理器開始事務(wù)處理,如果私有緩存中沒有需要的所述第一數(shù)據(jù),則根據(jù)地址映射訪問LLC的目錄;
[0020]S12、根據(jù)所述第一數(shù)據(jù)的緩存行在LLC的目錄中的第一狀態(tài)指示串,獲知所述第一數(shù)據(jù)的狀態(tài);如果所述第一數(shù)據(jù)的狀態(tài)為更改,則進(jìn)行步驟S13 ;
[0021]S13、根據(jù)所述第一狀態(tài)指示串中的數(shù)據(jù)標(biāo)識位確定具有最新的所述第一數(shù)據(jù)的處理器;如果為第二處理器,則從所述第二處理器的私有緩存將最新的所述第一數(shù)據(jù)取回到LLC,將所述第一數(shù)據(jù)在LLC的目錄中的狀態(tài)修改為共享;如果為第一處理器,則直接進(jìn)行第一處理器在私有緩存中對所述第一數(shù)據(jù)進(jìn)行寫操作的步驟;
[0022]S14、將所述第一數(shù)據(jù)從所述LLC中讀到所述第一處理器的私有緩存中,將所述第一狀態(tài)指示串中對應(yīng)于所述第一處理器的數(shù)據(jù)標(biāo)識位置位。
[0023]進(jìn)一步地,所述步驟S12中還包括:
[0024]如果所述第一數(shù)據(jù)的狀態(tài)為獨(dú)占且更改,則進(jìn)行步驟S13’ ;
[0025]所述方法還包括:
[0026]S13’、將所述第一數(shù)據(jù)在LLC的目錄中的狀態(tài)修改為共享且更改;進(jìn)行步驟S14。
[0027]進(jìn)一步地,在開始提交事務(wù)內(nèi)存的步驟后、事務(wù)內(nèi)存完成提交的步驟前還包括:
[0028]查詢所述第一數(shù)據(jù)在LLC目錄中狀態(tài)指示串的各數(shù)據(jù)標(biāo)識位,判斷除了所述第一處理器對應(yīng)的數(shù)據(jù)標(biāo)識位以外,是否存在置位的數(shù)據(jù)標(biāo)識位;如果存在,則無效化置位的數(shù)據(jù)標(biāo)識位對應(yīng)的處理器中的第一數(shù)據(jù),并將該數(shù)據(jù)標(biāo)識位復(fù)位。
[0029]本申請還提供了一種處理器,應(yīng)用在多核處理設(shè)備中,包括:
[0030]私有緩存、提交單元;
[0031]讀取單元,用于當(dāng)本處理器開始事務(wù)處理時,將第一數(shù)據(jù)讀取到所述私有緩存中;
[0032]寫操作單元,用于在所述私有緩存中對所述第一數(shù)據(jù)進(jìn)行寫操作,完成后指示所述提交單元開始提交事務(wù)內(nèi)存;
[0033]無效化單元,用于當(dāng)所述提交單元開始提交事務(wù)內(nèi)存后、完成事務(wù)內(nèi)存提交前,如果所述第一數(shù)據(jù)在被本處理器寫操作前的最后一次更改是由其它處理器進(jìn)行的,則將所述私有緩存中的所述第一數(shù)據(jù)寫到LLC中,無效化本處理器的私有緩存中的所述第一數(shù)據(jù)。
[0034]進(jìn)一步地,所述的處理器還包括:
[0035]設(shè)置單元,用于在所述寫操作單元將對所述第一數(shù)據(jù)進(jìn)行寫操作時,如果所述第一數(shù)據(jù)在被本處理器寫操作前的最后一次更改是由其它處理器進(jìn)行的,則將所述私有緩存中的第一數(shù)據(jù)的狀態(tài)修改為獨(dú)占且更改;如果所述第一數(shù)據(jù)在被本處理器寫操作前的最后一次更改是由本處理器進(jìn)行的,則將所述私有緩存中的所述第一數(shù)據(jù)的狀態(tài)修改為更改;在所述提交單元開始提交事務(wù)內(nèi)存后、完成事務(wù)內(nèi)存提交前,如果所述第一處理器的私有緩存中的所述第一數(shù)據(jù)的狀態(tài)為獨(dú)占且更改,則將所述第一數(shù)據(jù)在LLC目錄中的狀態(tài)設(shè)置為獨(dú)占且更改。
[0036]進(jìn)一步地,所述讀取單元當(dāng)本處理器開始事務(wù)處理時,將第一數(shù)據(jù)讀取到私有緩存中是指:
[0037]所述讀取單元當(dāng)本處理器開始事務(wù)處理時,如果私有緩存中沒有需要的所述第一數(shù)據(jù),則根據(jù)地址映射訪問LLC的目錄;根據(jù)所述第一數(shù)據(jù)的緩存行在LLC的目錄中的第一狀態(tài)指示串,獲知所述第一數(shù)據(jù)的狀態(tài);如果所述第一數(shù)據(jù)的狀態(tài)為更改,則根據(jù)所述第一狀態(tài)指示串中的數(shù)據(jù)標(biāo)識位確定具有最新的所述第一數(shù)據(jù)的處理器,如果為其它處理器,從該其它處理器的私有緩存將最新的所述第一數(shù)據(jù)取回到LLC,將所述第一數(shù)據(jù)在LLC的目錄中的狀態(tài)修改為共享,將所述第一數(shù)據(jù)從所述LLC中讀到本處理器的私有緩存中,將所述第一狀態(tài)指示串中對應(yīng)于本處理器的數(shù)據(jù)標(biāo)識位置位,指示所述寫操作單元在本處理器的私有緩存中對所述第一數(shù)據(jù)進(jìn)行寫操作;如果為本處理器,則直接指示所述寫操作單元在本處理器的私有緩存中對所述第一數(shù)據(jù)進(jìn)行寫操作。
[0038]進(jìn)一步地,所述讀取單元還用于當(dāng)根據(jù)地址映射訪問LLC的目錄,且根據(jù)所述第一數(shù)據(jù)的緩存行在LLC的目錄中的第一狀態(tài)指示串,獲知所述第一數(shù)據(jù)的狀態(tài)為獨(dú)占且更改時,將所述第一數(shù)據(jù)在LLC的目錄中的狀態(tài)修改為共享且更改。
[0039]進(jìn)一步地,所述無效化單元還用于查詢所述第一數(shù)據(jù)在LLC目錄中狀態(tài)指示串的各數(shù)據(jù)標(biāo)識位,判斷除了本處理器對應(yīng)的數(shù)據(jù)標(biāo)識位以外,是否存在置位的數(shù)據(jù)標(biāo)識位;如果存在,則無效化置位的數(shù)據(jù)標(biāo)識位對應(yīng)的處理器中的第一數(shù)據(jù),并將該數(shù)據(jù)標(biāo)識位復(fù)位。
[0040]本申請的至少一個實施例利用在現(xiàn)有的硬件Transact1n memory的基礎(chǔ)上,使用簡單的預(yù)測機(jī)制無縫地將提前無效化處理與硬件Trasact1n memory相結(jié)合,加快提高預(yù)測準(zhǔn)確性和Transact1n memory對關(guān)鍵區(qū)域的執(zhí)行效率,減少Transact1n Memory運(yùn)行時由于數(shù)據(jù)沖突產(chǎn)生的回滾時間,進(jìn)一步提高多核系統(tǒng)的運(yùn)行性能和可擴(kuò)展性。當(dāng)然,實施本申請的任一產(chǎn)品必不一定需要同時達(dá)到以上所述的所有優(yōu)點(diǎn)。
【附圖說明】
[0041]圖1a為多核并行系統(tǒng)中多個處理器的示意圖;
[0042]圖1b為各處理器的結(jié)構(gòu)示意圖;
[0043]圖2為數(shù)據(jù)在LLC的目錄中的狀態(tài)指示串的示意圖;
[0044]圖3為實施例一的數(shù)據(jù)處理方法的流程示意圖;
[0045]圖4為實施例一的第一個例子中開始時數(shù)據(jù)緩存行在LLC的目錄中的狀態(tài)指示串的不意圖;
[0046]圖5為實施例一的第一個例子中的數(shù)據(jù)處理