一種數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法
【專利摘要】本發(fā)明公開一種數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法。該方法是基于數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法,讓先到達(dá)柵欄的線程投機(jī)執(zhí)行,充分利用眾多線程之間同步數(shù)據(jù)造成的運(yùn)行時(shí)間浪費(fèi),加速程序運(yùn)行。本發(fā)明基于投機(jī),判斷,回滾的流程通過回滾錯(cuò)誤的投機(jī)來保證程序的正確性。本發(fā)明對(duì)投機(jī)判斷和回滾判斷進(jìn)行了建模,保證其效率。本發(fā)明通過限制投機(jī)深度,使得投機(jī)收益在減去該投機(jī)開銷后保持一定范圍內(nèi)的穩(wěn)定,從而提供穩(wěn)定的程序運(yùn)行速度提升。
【專利說明】一種數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及片上多核體系結(jié)構(gòu)并行【技術(shù)領(lǐng)域】,特別是涉及一種數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法。
【背景技術(shù)】
[0002]片上多核體系結(jié)構(gòu)(Chip multiprocessors)技術(shù)通過在一個(gè)芯片上集成多個(gè)微處理器核心來提高程序的并行性。每個(gè)微處理器核心實(shí)質(zhì)上都是一個(gè)相對(duì)簡(jiǎn)單的單線程微處理器或者比較簡(jiǎn)單的多線程微處理器,這樣多個(gè)微處理器核心就可以并行地執(zhí)行程序代碼,因而具有了較高的線程級(jí)并行性。
[0003]控制多線程使它們串行化來訪問共享資源(包括硬件資源和軟件資源),以達(dá)到多線程同步的目的。不論是硬件臨界資源,還是軟件臨界資源,多個(gè)線程必須互斥地對(duì)它進(jìn)行訪問,即每個(gè)時(shí)刻,只能有一個(gè)線程訪問臨界資源。目前主要有三種主流的方法:(1)臨界區(qū);每個(gè)線程中訪問臨界資源的那段代碼稱為臨界區(qū)(Critical Section)(臨界資源是一次僅允許一個(gè)線程使用的共享資源)。每次只準(zhǔn)許一個(gè)線程進(jìn)入臨界區(qū),進(jìn)入后不允許其他線程進(jìn)入;當(dāng)一個(gè)線程退出臨界區(qū)后,再允許其他線程進(jìn)入。(2)信號(hào)量;信號(hào)量機(jī)制被廣泛的用于單處理機(jī)和多處理機(jī)系統(tǒng)以及計(jì)算機(jī)網(wǎng)絡(luò)中。信號(hào)量S是一個(gè)整數(shù),S大于等于零是代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù)量,當(dāng)S小于零時(shí)則表示正在等待使用該資源的而被阻塞的進(jìn)程數(shù)。(3)互斥量(mutex)可以看成是信號(hào)量的一個(gè)簡(jiǎn)化機(jī)制,它不需要信號(hào)量的計(jì)數(shù)功能,互斥量?jī)H僅適用于管理共享資源或一小段代碼。由于互斥量在實(shí)現(xiàn)時(shí)既容易又有效,這使得互斥量在實(shí)現(xiàn)用戶空間線程包時(shí)非常有用。(4)事件(Event)用來通知線程有一些事件已發(fā)生,從而啟動(dòng)后繼任務(wù)的開始。一個(gè)事件有兩種狀態(tài):激發(fā)狀態(tài)和未激發(fā)狀態(tài)。事件又分兩種類型:手動(dòng)重置事件和自動(dòng)重置事件。手動(dòng)重置事件被設(shè)置為激發(fā)狀態(tài)后,會(huì)喚醒所有等待的線程,而且一直保持為激發(fā)狀態(tài),直到程序重新把它設(shè)置為未激發(fā)狀態(tài)。自動(dòng)重置事件被設(shè)置為激發(fā)狀態(tài)后,會(huì)喚醒一個(gè)等待中的線程,然后自動(dòng)恢復(fù)為未激發(fā)狀態(tài)。
[0004]雖然多核體系結(jié)構(gòu)的發(fā)展日益成熟以及多核多線程編程模型日加完善,但是這些多線程編程模型都存在明顯的缺陷。在目前工業(yè)界中成熟使用的多線程編程模型中,在程序執(zhí)行的某一階段,允許多線程自由執(zhí)行,但是運(yùn)行到某一代碼段處,需要進(jìn)行同步等待,當(dāng)所有的線程都達(dá)到預(yù)定的代碼段后,才能進(jìn)行下一階段的執(zhí)行。各個(gè)線程運(yùn)行有一定的自由度,但存在類似于聚合的約束性,這樣就沒有充分利用到多核各個(gè)核的計(jì)算處理能力,硬件資源空閑。這樣,那些因同步等待的線程會(huì)被阻塞,在同步等待的時(shí)間里,這些被阻塞的線程停止運(yùn)行,沒有進(jìn)行工作,白白浪費(fèi)了寶貴的運(yùn)行時(shí)間,大大降低了程序的運(yùn)行效率。
[0005]針對(duì)這個(gè)缺陷,我們需要設(shè)計(jì)出一種機(jī)制,使提前到達(dá)柵欄處的線程不用等待還未到達(dá)的線程,讓它攜帶自己的數(shù)據(jù)繼續(xù)向前執(zhí)行,這樣如果它自己攜帶的數(shù)據(jù)與最后的數(shù)據(jù)相同或者不影響線程執(zhí)行的結(jié)果,那么向前執(zhí)行的這部分工作就相當(dāng)于提前完成了 ;如果由于該線程攜帶的數(shù)據(jù)不是后續(xù)執(zhí)行所使用的正確結(jié)果,提前執(zhí)行的這部分工作就是無用功,需要返回到原來的柵欄處,但是在這部分時(shí)間段內(nèi)該線程原本就是等待阻塞狀態(tài),因此提前執(zhí)行的這部分工作并不影響程序的這個(gè)性能。
[0006]為了獲得更多的性能提升,近年來研究人員提出的多線程投機(jī)技術(shù),這些線程級(jí)投機(jī)技術(shù)包括事務(wù)內(nèi)存(TransactionalMemory)投機(jī),線程級(jí)并行化投機(jī)(SpeculativeParallel Threading)和檢測(cè)點(diǎn)(Checkpointed)多核投機(jī)技術(shù)以及基于硬件實(shí)現(xiàn)的投機(jī)技術(shù),該技術(shù)將中間執(zhí)行結(jié)果暫時(shí)保存在專門設(shè)置的緩沖存儲(chǔ)器中,直到本投機(jī)線程變?yōu)榉峭稒C(jī)狀態(tài)為止,并判斷是否有違反串行數(shù)據(jù)依賴的情況發(fā)生。如果發(fā)現(xiàn)投機(jī)線程執(zhí)行中違反串行數(shù)據(jù)依賴關(guān)系,就認(rèn)為該投機(jī)線程投機(jī)失敗,則由相關(guān)硬件回滾該投機(jī)線程并重新執(zhí)行該投機(jī)線程。
[0007]在以上方法中,軟件投機(jī)方法恢復(fù)一次的代價(jià)相當(dāng)?shù)母?,基于硬件?shí)現(xiàn)的投機(jī)并行由于硬件開銷比較大,實(shí)現(xiàn)起來很復(fù)雜,并且基于硬件機(jī)制的投機(jī)并行大部分局限于模擬研究階段。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的是針對(duì)現(xiàn)有技術(shù)的不足,提供一種數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法。
[0009]目前在運(yùn)用同步和柵欄機(jī)制來實(shí)現(xiàn)多線程協(xié)同工作提高多核體系結(jié)構(gòu)資源利用率的系統(tǒng)中,首先先到達(dá)柵欄的線程需要等待,后到達(dá)柵欄的線程,匯總數(shù)據(jù)以繼續(xù)執(zhí)行。
[0010]本發(fā)明提出,對(duì)于先于其他到達(dá)柵欄的線程,允許其攜帶自身的數(shù)據(jù)繼續(xù)執(zhí)行而不是等待其他線程。其攜帶的數(shù)據(jù)稱為容錯(cuò)數(shù)據(jù),該帶有容錯(cuò)數(shù)據(jù)的線程稱為容錯(cuò)投機(jī)線程。
[0011]本發(fā)明方法包括以下步驟:
步驟(I).線程到達(dá)柵欄,賦予投機(jī)線程容錯(cuò)數(shù)據(jù)版本
多線程執(zhí)行過程中線程會(huì)遇到多個(gè)柵欄,對(duì)于任何先于其他線程到達(dá)某一柵欄的線程,從第一個(gè)穿越該柵欄的線程開始,每個(gè)線程所攜帶的容錯(cuò)數(shù)據(jù)賦予一個(gè)版本,該版本的賦予可以由其穿越該柵欄的次序決定;最后一個(gè)到達(dá)該柵欄的線程擁有數(shù)據(jù)的最終版本,所述的最終版本為數(shù)據(jù)的正確版本;
步驟(2).判斷投機(jī)線程容錯(cuò)數(shù)據(jù)版本是否為最終版本
當(dāng)某個(gè)投機(jī)線程到達(dá)柵欄時(shí),判斷其容錯(cuò)數(shù)據(jù)版本是否為最終版本;若不是最終版本,則該線程繼續(xù)投機(jī)執(zhí)行步驟(3);反之則標(biāo)記自身為非投機(jī)線程正確運(yùn)行并發(fā)出投機(jī)喚醒信號(hào),通知非最終版本的投機(jī)線程執(zhí)行步驟(5);
步驟(3).判斷非最終版本的投機(jī)線程是否收到收到投機(jī)喚醒信號(hào),若收到則執(zhí)行步驟(5),否則執(zhí)行步驟(4);
步驟(4).判斷投機(jī)線程是否需要回滾
對(duì)于非最終版本的投機(jī)線程,在其每到下一個(gè)柵欄時(shí)都要判斷其是否需要回滾,判斷線程回滾條件如下所述;如果不需要回滾,則繼續(xù)投機(jī)執(zhí)行;如果需要回滾,則回滾至該投機(jī)線程第一次投機(jī)執(zhí)行所在的柵欄;
所述的線程回滾的條件為:投機(jī)線程在最終版本的數(shù)據(jù)到達(dá)之前,若該線程已經(jīng)投機(jī)執(zhí)行超過了設(shè)定的投機(jī)深度,則回滾。[0012]所述的投機(jī)深度為允許投機(jī)線程攜帶容錯(cuò)數(shù)據(jù)穿越的柵欄數(shù)目;
步驟(5).判斷投機(jī)線程是否投機(jī)成功
對(duì)于非最終版本的投機(jī)線程,在收到投機(jī)喚醒信號(hào)后都要判斷自身是否投機(jī)成功,投機(jī)成功的判斷條件如下所述;如果投機(jī)成功,則標(biāo)記自身為非投機(jī)線程正確運(yùn)行;反之則回滾至該投機(jī)線程第一次投機(jī)執(zhí)行時(shí)所在的柵欄;
所述的投機(jī)成功條件包括兩種,滿足任意一種即可:第一種,投機(jī)線程內(nèi)的容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)相同,則認(rèn)為投機(jī)成功;第二種,投機(jī)線程內(nèi)的容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)不相同,但是該投機(jī)線程不依賴于投機(jī)線程內(nèi)與最終版本數(shù)據(jù)不同的容錯(cuò)數(shù)據(jù),或者該投機(jī)線程最終的運(yùn)行結(jié)果與容錯(cuò)數(shù)據(jù)無關(guān)。
[0013]本發(fā)明的有益效果是: 1.本發(fā)明提出容錯(cuò)數(shù)據(jù)和容錯(cuò)投機(jī)線程兩個(gè)概念,對(duì)于先于其他到達(dá)柵欄的線程,允許其攜帶自身的數(shù)據(jù)繼續(xù)執(zhí)行而不是等待其他線程,減少線程同步的等待時(shí)間。
[0014]2.對(duì)本發(fā)明用容錯(cuò)數(shù)據(jù)版本來管理多個(gè)線程自身的數(shù)據(jù)和最終正確版本數(shù)據(jù)之間的關(guān)系,簡(jiǎn)化了投機(jī)線程容錯(cuò)數(shù)據(jù)的管理。每個(gè)線程所攜帶的容錯(cuò)數(shù)據(jù)都有一個(gè)版本,該版本可以用其穿越特定柵欄的次序決定,最后一個(gè)到達(dá)柵欄的線程擁有數(shù)據(jù)的最終版本(也就是肯定正確的版本);每個(gè)柵欄都維護(hù)一個(gè)這樣的數(shù)據(jù)版本。
[0015]3.本發(fā)明提出投機(jī)成功的兩個(gè)條件:第一種,容錯(cuò)投機(jī)線程內(nèi)容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)相同則可以認(rèn)為投機(jī)成功;第二種,容錯(cuò)投機(jī)線程內(nèi)容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)不相同,但是該容錯(cuò)投機(jī)線程內(nèi)部數(shù)據(jù)不依賴與容錯(cuò)數(shù)據(jù)或者該線程最終的運(yùn)行結(jié)果與容錯(cuò)數(shù)據(jù)無關(guān),這樣雖然容錯(cuò)數(shù)據(jù)是不正確的數(shù)據(jù),但是這個(gè)錯(cuò)誤不影響線程最終的結(jié)果。特別是第二種條件,有效的提高投機(jī)成功的概率。
[0016]4.本發(fā)明提出對(duì)于投機(jī)執(zhí)行超過了設(shè)定的投機(jī)深度的線程,不再向前投機(jī),從而有效保證投機(jī)成功的概率。
[0017]5.本發(fā)明的投機(jī)收益高。
【專利附圖】
【附圖說明】
[0018]圖1是投機(jī)線程工作的流程圖。
【具體實(shí)施方式】
[0019]下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步的分析。
[0020]如圖1所示,本發(fā)明方法是:
步驟(1).線程到達(dá)柵欄,賦予投機(jī)線程容錯(cuò)數(shù)據(jù)版本
多線程執(zhí)行過程中線程會(huì)遇到多個(gè)柵欄,對(duì)于任何先于其他線程到達(dá)某一柵欄的線程,從第一個(gè)穿越該柵欄的線程開始,每個(gè)線程所攜帶的容錯(cuò)數(shù)據(jù)賦予一個(gè)版本,該版本的賦予可以由其穿越該柵欄的次序決定;最后一個(gè)到達(dá)該柵欄的線程擁有數(shù)據(jù)的最終版本,所述的最終版本為數(shù)據(jù)的正確版本;
數(shù)據(jù)版本記錄的數(shù)據(jù)結(jié)構(gòu)定義如下所示:
00: s true t VersionRecord {
01: char* version;// 版本號(hào)
02: bool IsLastVersion; //該數(shù)據(jù)版本是否為最終版本 03: datatype* dataref; //該版本對(duì)應(yīng)的數(shù)據(jù) 04: unsigned threadID;//攜帶該版本數(shù)據(jù)的線程號(hào) 05: };
05:s tack<VersionRecord} Da ta_Barrier_ Version; // 數(shù)據(jù)版本記錄棧該數(shù)據(jù)結(jié)構(gòu)內(nèi)定義有三個(gè)成員變量:version代表數(shù)據(jù)的版本號(hào),dataref指針指向該版本對(duì)應(yīng)的數(shù)據(jù),threadID為攜帶該數(shù)據(jù)版本的線程號(hào)。
[0021]步驟(2).判斷投機(jī)線程容錯(cuò)數(shù)據(jù)版本是否為最終版本
當(dāng)某個(gè)投機(jī)線程到達(dá)柵欄時(shí),判斷其容錯(cuò)數(shù)據(jù)版本是否為最終版本;若不是最終版本,則該線程繼續(xù)投機(jī)執(zhí)行步驟(3);反之則標(biāo)記自身為非投機(jī)線程正確運(yùn)行并發(fā)出投機(jī)喚醒信號(hào),通知非最終版本的投機(jī)線程執(zhí)行步驟(5);
步驟(3).判斷非最終版本的投機(jī)線程是否收到收到投機(jī)喚醒信號(hào),若收到則執(zhí)行步驟(5),否則執(zhí)行步驟(4);
步驟(4).判斷投機(jī)線程是否需要回滾
對(duì)于非最終版本的投機(jī)線程,在其每到下一個(gè)柵欄時(shí)都要判斷其是否需要回滾,判斷線程回滾條件如下所述;如果不需要回滾,則繼續(xù)投機(jī)執(zhí)行;如果需要回滾,則回滾至該投機(jī)線程第一次投機(jī)執(zhí)行所在的柵欄;
所述的線程回滾的條件為:投機(jī)線程在最終版本的數(shù)據(jù)到達(dá)之前,若該線程已經(jīng)投機(jī)執(zhí)行超過了設(shè)定的投機(jī)深度,則回滾。
[0022]所述的投機(jī)深度為允許投機(jī)線程攜帶容錯(cuò)數(shù)據(jù)穿越的柵欄數(shù)目;
步驟(5).判斷投機(jī)線程是否投機(jī)成功
對(duì)于非最終版本的投機(jī)線程,在收到投機(jī)喚醒信號(hào)后都要判斷自身是否投機(jī)成功,投機(jī)成功的判斷條件如下所述;如果投機(jī)成功,則標(biāo)記自身為非投機(jī)線程正確運(yùn)行;反之則回滾至該投機(jī)線程第一次投機(jī)執(zhí)行時(shí)所在的柵欄;
所述的投機(jī)成功條件包括兩種,滿足任意一種即可:第一種,投機(jī)線程內(nèi)的容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)相同,則認(rèn)為投機(jī)成功;第二種,投機(jī)線程內(nèi)的容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)不相同,但是該投機(jī)線程不依賴于投機(jī)線程內(nèi)與最終版本數(shù)據(jù)不同的容錯(cuò)數(shù)據(jù),或者該投機(jī)線程最終的運(yùn)行結(jié)果與容錯(cuò)數(shù)據(jù)無關(guān)。
[0023]上述實(shí)施例并非是對(duì)于本發(fā)明的限制,本發(fā)明并非僅限于上述實(shí)施例,只要符合本發(fā)明要求,均屬于本發(fā)明的保護(hù)范圍。
【權(quán)利要求】
1.一種數(shù)據(jù)容錯(cuò)的多線程投機(jī)方法,其特征在于該方法包括以下步驟: 步驟(I).線程到達(dá)柵欄,賦予投機(jī)線程容錯(cuò)數(shù)據(jù)版本: 多線程執(zhí)行過程中線程會(huì)遇到多個(gè)柵欄,對(duì)于任何先于其他線程到達(dá)某一柵欄的線程,從第一個(gè)穿越該柵欄的線程開始,每個(gè)線程所攜帶的容錯(cuò)數(shù)據(jù)賦予一個(gè)版本,該版本的賦予由其穿越該柵欄的次序決定;最后一個(gè)到達(dá)該柵欄的線程擁有數(shù)據(jù)的最終版本,所述的最終版本為數(shù)據(jù)的正確版本; 步驟(2).判斷投機(jī)線程容錯(cuò)數(shù)據(jù)版本是否為最終版本: 當(dāng)某個(gè)投機(jī)線程到達(dá)柵欄時(shí),判斷其容錯(cuò)數(shù)據(jù)版本是否為最終版本;若不是最終版本,則該線程繼續(xù)投機(jī)執(zhí)行步驟(3);反之則標(biāo)記自身為非投機(jī)線程正確運(yùn)行并發(fā)出投機(jī)喚醒信號(hào),通知非最終版本的投機(jī)線程執(zhí)行步驟(5); 步驟(3).判斷非最終版本的投機(jī)線程是否收到收到投機(jī)喚醒信號(hào),若收到則執(zhí)行步驟(5),否則執(zhí)行步驟(4); 步驟(4).判斷投機(jī)線程是否需要回滾: 對(duì)于非最終版本的投機(jī)線程,在其每到下一個(gè)柵欄時(shí)都要判斷其是否需要回滾,判斷線程回滾條件如下所述;如果不需要回滾,則繼續(xù)投機(jī)執(zhí)行;如果需要回滾,則回滾至該投機(jī)線程第一次投機(jī)執(zhí)行所在的柵欄; 所述的線程回滾的條件為:投機(jī)線程在最終版本的數(shù)據(jù)到達(dá)之前,若該線程已經(jīng)投機(jī)執(zhí)行超過了設(shè)定的投機(jī)深度,則回滾; 所述的投機(jī)深度為允許投機(jī)線程攜帶容錯(cuò)數(shù)據(jù)穿越的柵欄數(shù)目; 步驟(5).判斷投機(jī)線程是否投機(jī)成功: 對(duì)于非最終版本的投機(jī)線程,在收到投機(jī)喚醒信號(hào)后都要判斷自身是否投機(jī)成功,投機(jī)成功的判斷條件如下所述;如果投機(jī)成功,則標(biāo)記自身為非投機(jī)線程正確運(yùn)行;反之則回滾至該投機(jī)線程第一次投機(jī)執(zhí)行時(shí)所在的柵欄; 所述的投機(jī)成功條件為:投機(jī)線程內(nèi)的容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)相同;或者投機(jī)線程內(nèi)的容錯(cuò)數(shù)據(jù)與最終版本的數(shù)據(jù)不相同,但該投機(jī)線程最終的運(yùn)行結(jié)果與容錯(cuò)數(shù)據(jù)無關(guān)。
【文檔編號(hào)】G06F11/07GK103942096SQ201410111160
【公開日】2014年7月23日 申請(qǐng)日期:2014年3月24日 優(yōu)先權(quán)日:2014年3月24日
【發(fā)明者】孟靜磊, 潘平, 袁明敏, 李頌元, 邵景程, 馬建良, 俞立呈, 陳天洲, 劉莉, 施青松 申請(qǐng)人:浙江大學(xué)