本發(fā)明屬于集成電路設(shè)計(jì)技術(shù)領(lǐng)域,具體為一種基于共享存儲(chǔ)器的數(shù)據(jù)通信同步方法。
背景技術(shù):
在共享存儲(chǔ)的多核處理器中,一般會(huì)引入cache結(jié)構(gòu)將共享存儲(chǔ)空間的數(shù)據(jù)緩存到本地,利用其本身的結(jié)構(gòu)特性來加速多核獲取數(shù)據(jù)的過程。由于每個(gè)處理器看到的存儲(chǔ)器視圖都是通過本地cache得到的,因此對(duì)于同一個(gè)存儲(chǔ)位置的數(shù)據(jù)來說,不同的處理器可能會(huì)獲取到不同的數(shù)據(jù)值。在多核處理器設(shè)計(jì)中,必須引入cache一致性維護(hù)機(jī)制,確保每個(gè)處理器核對(duì)存儲(chǔ)器中同一位置的讀取操作總能獲得最新寫入的值。隨著多核(多線程)之間數(shù)據(jù)交互模式的日趨復(fù)雜,能否提供高效的cache一致性維護(hù)機(jī)制,直接影響到多線程工作負(fù)載在多核上的運(yùn)行效率及正確性。
為了解決cache一致性問題,人們陸續(xù)提出了許多方案,其中公認(rèn)比較有效并為商業(yè)多處理器系統(tǒng)所采用的有基于總線監(jiān)聽的MESI(或MOESI)協(xié)議和基于目錄的協(xié)議等。
通過引入cache來提高處理器訪問數(shù)據(jù)的速度的代價(jià)對(duì)于對(duì)數(shù)據(jù)訪問速度要求不高的系統(tǒng)來說是比較高昂的,因?yàn)樾枰鉀Q維護(hù)cache一致性的問題。本發(fā)明需要解決的是在不引入cache的情況下,即處理器之間的數(shù)據(jù)通信僅通過共享存儲(chǔ)器來實(shí)現(xiàn),如何來確保多核之間數(shù)據(jù)通信的同步問題?;诒景l(fā)明的多核SoC需要實(shí)現(xiàn)的是并行GPDT算法,每個(gè)處理器負(fù)責(zé)矩陣運(yùn)算的一部分,然后將各個(gè)處理器的計(jì)算結(jié)果進(jìn)行拼接或累加來構(gòu)造完整結(jié)果。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種在基于共享存儲(chǔ)器的多核片上系統(tǒng)中解決多核之間數(shù)據(jù)通信的同步問題的方法。
對(duì)于結(jié)果拼接的通信過程,根據(jù)每個(gè)處理器分配的工作量來將共享地址空間分割,使得每個(gè)處理器與分割后的地址空間片段一一對(duì)應(yīng),每個(gè)處理器只需將本核計(jì)算得到的數(shù)據(jù)塊寫入本核對(duì)應(yīng)的地址空間即可;對(duì)于結(jié)果累加的通信過程,則無需將地址空間分割,每個(gè)處理器都從同一個(gè)起始地址開始覆蓋寫入數(shù)據(jù)即可。在多個(gè)核對(duì)共享存儲(chǔ)器進(jìn)行讀寫時(shí),為了避免數(shù)據(jù)發(fā)生沖突,包括避免每個(gè)處理器在其他核寫入數(shù)據(jù)之前讀取或者在其他核讀取過程中寫入,本發(fā)明設(shè)計(jì)了一種雙標(biāo)識(shí)位的數(shù)據(jù)同步方法,即每個(gè)處理器按照“檢測(cè)標(biāo)識(shí)-修改標(biāo)識(shí)-訪問存儲(chǔ)-還原標(biāo)識(shí)”的機(jī)制來工作。
為了對(duì)共享存儲(chǔ)器的數(shù)據(jù)讀寫操作進(jìn)行同步,本發(fā)明為每個(gè)處理器的每個(gè)共享數(shù)據(jù)塊設(shè)計(jì)一個(gè)2 bit的標(biāo)識(shí)位,用來表征該數(shù)據(jù)塊對(duì)于其他處理器來說是否可讀可寫的情況;例如,標(biāo)識(shí)位可設(shè)置如下:00,不可讀不可寫;01,不可讀可寫;10,可讀不可寫;11,可讀可寫。
設(shè)SoC系統(tǒng)共有N個(gè)處理器,則對(duì)于共享存儲(chǔ)器中的每個(gè)共享數(shù)據(jù)塊來說有2N bit的標(biāo)識(shí)位;當(dāng)某個(gè)處理器開始對(duì)共享存儲(chǔ)器中某個(gè)數(shù)據(jù)塊進(jìn)行讀寫時(shí),基于雙標(biāo)識(shí)的數(shù)據(jù)同步方法為:
讀數(shù)據(jù),具體步驟為:
(1)檢測(cè)標(biāo)識(shí):讀取標(biāo)識(shí)并檢測(cè),如果數(shù)據(jù)不可讀,等待;否則,進(jìn)入步驟(2);
(2)修改標(biāo)識(shí):將讀取標(biāo)識(shí)暫存,并修改本核對(duì)應(yīng)的標(biāo)識(shí)為不可寫;
(3)訪問存儲(chǔ):將該數(shù)據(jù)塊中的數(shù)據(jù)讀取到本地存儲(chǔ)器中;
(4)還原標(biāo)識(shí):將標(biāo)識(shí)還原到檢測(cè)標(biāo)識(shí)之前的狀態(tài)。
寫數(shù)據(jù),具體步驟為:
(1)檢測(cè)標(biāo)識(shí):讀取標(biāo)識(shí)并檢測(cè),如果數(shù)據(jù)不可寫,等待;否則,進(jìn)入步驟(2);
(2)修改標(biāo)志:將讀取標(biāo)識(shí)暫存,并修改本核對(duì)應(yīng)的標(biāo)識(shí)為不可讀不可寫;
(3)訪問存儲(chǔ):將本地?cái)?shù)據(jù)寫入該核對(duì)應(yīng)的數(shù)據(jù)塊中;
(4)還原標(biāo)識(shí):將本核對(duì)應(yīng)的標(biāo)識(shí)改為不可讀可寫。
冗余寫:
基于上述雙標(biāo)識(shí)數(shù)據(jù)同步規(guī)則來實(shí)現(xiàn)基于共享存儲(chǔ)器的多核系統(tǒng)之間的通信,仍然有比較小的概率發(fā)生數(shù)據(jù)沖突,主要發(fā)生在標(biāo)識(shí)的讀寫過程,因?yàn)槊總€(gè)核對(duì)標(biāo)識(shí)的讀取和修改之間存在標(biāo)識(shí)的判斷邏輯,會(huì)間隔一段時(shí)間,如果某個(gè)核需要寫入共享存儲(chǔ)器,在讀取標(biāo)識(shí)之后進(jìn)行判斷,檢測(cè)到該數(shù)據(jù)塊可讀可寫,但還未修改標(biāo)識(shí)的時(shí)候,另外一個(gè)核需要讀取共享存儲(chǔ)器,對(duì)標(biāo)識(shí)進(jìn)行讀取則檢測(cè)到該數(shù)據(jù)塊可讀,那么會(huì)發(fā)生一個(gè)核寫數(shù)據(jù)同時(shí)另一個(gè)核讀數(shù)據(jù)的情況,很可能使得讀取到的數(shù)據(jù)發(fā)生錯(cuò)誤。為了避免這種數(shù)據(jù)沖突,本發(fā)明在每次讀取標(biāo)識(shí)之后添加一個(gè)冗余寫標(biāo)識(shí)的操作,將標(biāo)識(shí)全部設(shè)置為不可讀不可寫,例如將全部標(biāo)識(shí)置為00,即讀取標(biāo)識(shí)之后將標(biāo)識(shí)鎖住,等待標(biāo)識(shí)的判斷邏輯完成之后,再由本核對(duì)標(biāo)識(shí)進(jìn)行還原或者修改。這樣大大降低了發(fā)生數(shù)據(jù)沖突的概率。
附圖說明
圖1:共享存儲(chǔ)器結(jié)構(gòu)(a)結(jié)果拼接(b)結(jié)果累加。
圖2:算法中各函數(shù)表示的意義。
具體實(shí)施方式
下面結(jié)合附圖,對(duì)本發(fā)明作進(jìn)一步的描述。
本發(fā)明基于在多核SOC上實(shí)現(xiàn)并行GPDT算法。首先將每個(gè)需要共享的數(shù)據(jù)塊在共享存儲(chǔ)器中分配一塊地址空間,對(duì)于結(jié)果拼接的通信過程,根據(jù)每個(gè)處理器分配到的工作量來將共享地址空間分割,使得每個(gè)處理器與分割之后的地址空間片段一一對(duì)應(yīng),每個(gè)處理器只需將本核計(jì)算得到的數(shù)據(jù)塊寫入本核對(duì)應(yīng)的地址空間;對(duì)于結(jié)果累加的通信過程,則無需將地址空間分割,每個(gè)處理器從同一個(gè)起始地址開始覆蓋寫入,如圖1所示。
為每個(gè)處理器對(duì)應(yīng)的共享數(shù)據(jù)塊設(shè)計(jì)一個(gè)2bit的標(biāo)識(shí)位,用來表征該數(shù)據(jù)塊對(duì)于其他處理器來說是否可讀可寫的情況,標(biāo)識(shí)位設(shè)置如表1所示:00,不可讀不可寫;01,不可讀可寫;10,可讀不可寫;11,可讀可寫。
如果多核系統(tǒng)中有8個(gè)處理器,那么對(duì)于每個(gè)共享數(shù)據(jù)塊來說共需要16bit的標(biāo)識(shí)位來表征該數(shù)據(jù)塊對(duì)于每個(gè)處理器是否可讀可寫的情況,該標(biāo)識(shí)位也存儲(chǔ)在共享存儲(chǔ)器中。
當(dāng)某個(gè)處理器開始對(duì)共享存儲(chǔ)器中某個(gè)數(shù)據(jù)塊進(jìn)行讀寫時(shí),按照如下“檢測(cè)標(biāo)識(shí)-修改標(biāo)識(shí)-訪問存儲(chǔ)-還原標(biāo)識(shí)”的數(shù)據(jù)同步機(jī)制來進(jìn)行。
1、讀數(shù)據(jù),具體步驟為:
(1)檢測(cè)標(biāo)識(shí):讀取標(biāo)識(shí)并檢測(cè),如果有任何一個(gè)核對(duì)應(yīng)的標(biāo)識(shí)位00/01,則表示該數(shù)據(jù)塊不可讀,等待;否則進(jìn)入步驟(2);
(2)修改標(biāo)識(shí):如果該數(shù)據(jù)塊可讀,則先將讀取的標(biāo)識(shí)暫存,再將本核對(duì)應(yīng)的標(biāo)識(shí)改為10,表示該數(shù)據(jù)塊正在被讀取;
(3)訪問存儲(chǔ):將該數(shù)據(jù)塊中的數(shù)據(jù)讀取到本地存儲(chǔ)器中;
(4)還原標(biāo)識(shí):將標(biāo)識(shí)還原到檢測(cè)標(biāo)識(shí)之前的狀態(tài)。
2、寫數(shù)據(jù),具體步驟為:
(1)檢測(cè)標(biāo)識(shí):讀取標(biāo)識(shí)并檢測(cè),如果有任何一個(gè)核對(duì)應(yīng)的標(biāo)識(shí)位為00/10,則表示該數(shù)據(jù)塊不可寫,等待;否則進(jìn)入步驟(2);
(2)修改標(biāo)識(shí):如果該數(shù)據(jù)塊可寫,則先將讀取的標(biāo)識(shí)暫存,再將本核對(duì)應(yīng)的的標(biāo)識(shí)修改為00,表示該數(shù)據(jù)正在被寫入;
(3)訪問存儲(chǔ):將本地?cái)?shù)據(jù)寫入該核對(duì)應(yīng)的數(shù)據(jù)塊中;
(4)還原標(biāo)識(shí):將本核對(duì)應(yīng)的標(biāo)識(shí)改為01。
注意,寫入數(shù)據(jù)后并沒有將標(biāo)識(shí)還原為檢測(cè)標(biāo)識(shí)之前的狀態(tài),而是置為01.考慮到通信同步,是由主核來負(fù)責(zé)檢測(cè)標(biāo)識(shí),當(dāng)所有核的標(biāo)識(shí)位都為01時(shí),才由主核將負(fù)責(zé)將所有標(biāo)識(shí)置為11。
另外,由于處理器核對(duì)標(biāo)識(shí)位的讀取和修改之間存在判斷邏輯,中間存在一段時(shí)間的間隔。如果某個(gè)核需要寫入共享存儲(chǔ)器,在讀取標(biāo)識(shí)之后,檢測(cè)到該數(shù)據(jù)塊可讀可寫,但還未修改標(biāo)識(shí)的時(shí)候,另一個(gè)核需要讀取共享存儲(chǔ)器,就會(huì)檢測(cè)該數(shù)據(jù)塊可讀,這時(shí)就會(huì)發(fā)生數(shù)據(jù)邊寫邊讀的情況,從而使另一個(gè)核讀取到的數(shù)據(jù)發(fā)生錯(cuò)誤,如圖2所示。圖2中各函數(shù)的意義如表2所示。為了避免這種情況發(fā)生,采取的措施是在每次讀取標(biāo)識(shí)位之后添加一個(gè)冗余寫標(biāo)識(shí)的操作,將全部標(biāo)識(shí)置為00,對(duì)所有處理器不可讀不可寫,等待標(biāo)識(shí)的判斷邏輯完成之后,再由本核對(duì)標(biāo)識(shí)進(jìn)行還原或者修改,大大降低了數(shù)據(jù)發(fā)生沖突的概率。
添加冗余寫操作之后的完整的數(shù)據(jù)同步機(jī)制如下:
1、讀數(shù)據(jù),具體步驟為:
(1)檢測(cè)標(biāo)識(shí):讀取標(biāo)識(shí),將共享存儲(chǔ)器中所有標(biāo)識(shí)置為00,檢測(cè)讀取到的標(biāo)識(shí),如果有任何一個(gè)核對(duì)應(yīng)的標(biāo)識(shí)位00/01,則表示該數(shù)據(jù)塊不可讀,還原標(biāo)識(shí),等待;否則進(jìn)入2;
(2)修改標(biāo)識(shí):如果該數(shù)據(jù)塊可讀,則先將讀取的標(biāo)識(shí)暫存,再將本核對(duì)應(yīng)的標(biāo)識(shí)改為10,表示該數(shù)據(jù)塊正在被讀?。?/p>
(3)訪問存儲(chǔ):將該數(shù)據(jù)塊中的數(shù)據(jù)讀取到本地存儲(chǔ)器中;
(4)還原標(biāo)識(shí):將標(biāo)識(shí)還原到檢測(cè)標(biāo)識(shí)之前的狀態(tài)。
2、寫數(shù)據(jù),具體步驟為:
(1)檢測(cè)標(biāo)識(shí):讀取標(biāo)識(shí),將共享存儲(chǔ)器中所有標(biāo)識(shí)置為00,檢測(cè)讀取到的標(biāo)識(shí),如果有任何一個(gè)核對(duì)應(yīng)的標(biāo)識(shí)位為00/10,則表示該數(shù)據(jù)塊不可寫,還原標(biāo)識(shí),等待;否則進(jìn)入2;
(2)修改標(biāo)識(shí):如果該數(shù)據(jù)塊可寫,則先將讀取的標(biāo)識(shí)暫存,再將本核對(duì)應(yīng)的的標(biāo)識(shí)修改為00,表示該數(shù)據(jù)正在被寫入;
(3)訪問存儲(chǔ):將本地?cái)?shù)據(jù)寫入該核對(duì)應(yīng)的數(shù)據(jù)塊中;
(4)還原標(biāo)識(shí):將本核對(duì)應(yīng)的標(biāo)識(shí)改為01;
(5)還原標(biāo)識(shí)(僅主核):讀取并檢測(cè)所有核的標(biāo)識(shí),當(dāng)所有核的標(biāo)識(shí)位都為01時(shí),將所有標(biāo)識(shí)還原為11;否則,等待。
表1
表2
。