不平衡度,Dt為線程T的平均訪存延遲,Davg為所有線程的平均訪存延遲。
[0039]作為進(jìn)一步優(yōu)選的,所述采樣模塊還保存采樣過(guò)程中為線程訪問(wèn)變量分配的內(nèi)存大小及分配的內(nèi)存地址。
[0040]總體而言,按照本發(fā)明點(diǎn)的以上技術(shù)方案與現(xiàn)有技術(shù)相比,主要具備以下的技術(shù)優(yōu)點(diǎn):
[0041]1、能實(shí)現(xiàn)更細(xì)粒度,更有針對(duì)性的優(yōu)化。本發(fā)明中提出的整個(gè)平衡調(diào)度過(guò)程都只針對(duì)多線程程序并行運(yùn)行的部分,這正是多線程程序在NUMA架構(gòu)下運(yùn)行時(shí)容易由于訪存不一致性導(dǎo)致性能損耗的部分。同時(shí),本發(fā)明中提出的方案能夠針對(duì)每一個(gè)線程訪問(wèn)變量做出優(yōu)化調(diào)整,相比于現(xiàn)有技術(shù),該調(diào)整粒度更合理也更能發(fā)現(xiàn)訪存不一致導(dǎo)致的問(wèn)題。
[0042]2、本發(fā)明中提出的調(diào)度是一種實(shí)時(shí)分析調(diào)度方法,多線程程序在NUMA架構(gòu)下每一次的運(yùn)行都存在與上一次不盡相同的地方,這種實(shí)時(shí)的分析調(diào)度方式能夠更好地針對(duì)每一次運(yùn)行過(guò)程的特點(diǎn)進(jìn)行優(yōu)化,摒棄了現(xiàn)有技術(shù)中離線、靜態(tài)分析的缺陷。
[0043]3、本發(fā)明中提出的調(diào)度方式能夠?qū)崿F(xiàn)完全自動(dòng)化的優(yōu)化行為,不需要用戶參與。所有的優(yōu)化工作對(duì)于用戶來(lái)說(shuō)是完全透明的,相比于現(xiàn)有技術(shù),本發(fā)明不需要對(duì)用戶層代碼做任何的修改等工作。
【附圖說(shuō)明】
[0044]圖1為本發(fā)明NUMA架構(gòu)下平衡多線程間訪存延遲的調(diào)度系統(tǒng)框架示意圖;
[0045]圖2為與本發(fā)明系統(tǒng)對(duì)應(yīng)的NUMA架構(gòu)下平衡多線程間訪存延遲的調(diào)度方法流程圖。
【具體實(shí)施方式】
[0046]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0047]如圖1所示,本發(fā)明一種NUMA架構(gòu)下平衡多線程間訪存延遲的調(diào)度系統(tǒng),所述系統(tǒng)包括檢測(cè)模塊、采樣模塊、分析模塊、判斷模塊和調(diào)度模塊,其中,
[0048]檢測(cè)模塊,用于探測(cè)程序是否進(jìn)入多線程并行執(zhí)行區(qū)域,還用于在探測(cè)程序進(jìn)入多線程并行執(zhí)行區(qū)域后,啟動(dòng)采樣模塊;
[0049]采樣模塊,用于對(duì)多線程程序運(yùn)行過(guò)程中每個(gè)線程的訪存行為進(jìn)行采樣,并將采樣過(guò)程中獲取的訪存信息保存,本發(fā)明優(yōu)選使用紅黑樹方式進(jìn)行保存;其中,所述訪存信息包括發(fā)起訪存行為的線程ID,訪存行為的目的地址,完成訪存行為所耗費(fèi)的時(shí)鐘周期數(shù),訪存行為的類型。所述采樣模塊還用于保存采樣過(guò)程中為線程訪問(wèn)變量分配的內(nèi)存大小及分配的內(nèi)存地址。
[0050]分析模塊,一方面用于根據(jù)所述采樣模塊獲取的訪存信息,定期對(duì)所述多線程程序中各線程的訪存延遲不平衡度進(jìn)行評(píng)估,其中,所述訪存延遲不平衡度具體為:
[0051 ] ξτ= I DT-Davg I /Davg
[0052]其中,ξτ為線程T的訪存延遲不平衡度,Dt為線程T的平均訪存延遲,Davg為所有線程的平均訪存延遲。
[0053]所述分析模塊還用于針對(duì)發(fā)生不平衡現(xiàn)象的多線程程序進(jìn)行訪存行為分析,所述訪存行為分析具體包括:根據(jù)所述采樣模塊獲取的訪存信息,估計(jì)每個(gè)線程訪問(wèn)變量的線程平均訪存延遲,并依次將線程平均訪存延遲最大值的線程訪問(wèn)變量交由判斷模塊進(jìn)行處理。
[0054]此外,所述分析模塊還用于根據(jù)所述采樣模塊獲取的訪存信息進(jìn)行訪存規(guī)律分析;所述訪問(wèn)規(guī)律分析具體為:觀察多線程程序中每個(gè)線程訪問(wèn)的線程訪問(wèn)變量中是否沒(méi)有共同訪問(wèn)的線程訪問(wèn)變量子塊。
[0055]判斷模塊,用于根據(jù)所述訪存延遲不平衡度判斷是否發(fā)生多線程間訪存延遲不平衡現(xiàn)象,同時(shí),還用于在訪存延遲不平衡現(xiàn)象發(fā)生時(shí)進(jìn)一步判斷線程訪問(wèn)變量是否僅由一個(gè)線程訪問(wèn)、線程訪問(wèn)變量與訪問(wèn)該變量的線程是否處于同一個(gè)節(jié)點(diǎn)及線程訪問(wèn)變量大小是否小于第二閾值Size(該值可取所用系統(tǒng)一次訪存讀取的數(shù)據(jù)大小),此外,所述判斷模塊,還用于判斷程序多線程并行執(zhí)行的區(qū)域是否結(jié)束;
[0056]調(diào)度模塊,用于根據(jù)所述分析模塊的訪存行為分析和訪問(wèn)規(guī)律分析,及判斷模塊的判斷結(jié)果對(duì)遠(yuǎn)端訪存的線程訪問(wèn)變量進(jìn)行迀移調(diào)度至線程所在節(jié)點(diǎn)或使用交錯(cuò)存放將其平均分配到各節(jié)點(diǎn)上。
[0057]本發(fā)明提出了一種基于上述系統(tǒng)的NUMA架構(gòu)下平衡多線程間訪存延遲的調(diào)度方法,概括來(lái)說(shuō),所述方法包括采樣,分析,以及調(diào)度三個(gè)部分。
[0058]采樣是指在多線程程序運(yùn)行過(guò)程中對(duì)每個(gè)線程的訪存行為進(jìn)行采樣,并將采樣過(guò)程中獲取的訪存信息通過(guò)有效的組織方式,如使用紅黑樹方式保存,從而用于分析模塊進(jìn)行分析;分析所做的主要工作是根據(jù)采樣獲得的訪存信息預(yù)測(cè)該多線程程序中各線程的訪存延遲是否不平衡,以及如果不平衡,具體是哪個(gè)線程因?yàn)槭裁淳壒试斐闪瞬黄胶?調(diào)度部分所做的工作是根據(jù)分析的結(jié)果進(jìn)行合理的調(diào)度,決定應(yīng)該針對(duì)哪個(gè)線程訪問(wèn)變量采取什么樣的措施盡快消除這種訪存延遲不平衡現(xiàn)象,從而保證各線程的訪存延遲基本相等。
[0059]其中,具體來(lái)說(shuō),采樣過(guò)程我們可以借助硬件提供的采樣機(jī)制進(jìn)行訪存行為的采樣,例如Intel芯片提供的精確事件米樣機(jī)制(PEBS)以及AMD芯片提供的指令米樣機(jī)制(IBS)都可以通過(guò)采樣的方式,提供多線程運(yùn)行過(guò)程中的訪存信息。包括各種存儲(chǔ)訪問(wèn)行為相關(guān)的數(shù)據(jù)以及地址,執(zhí)行該行為的線程,線程所在(PU以及節(jié)點(diǎn)等信息。在分析過(guò)程中,我們可以通過(guò)建立紅黑樹的方式將采樣過(guò)程中收集到的信息保存起來(lái),為每一個(gè)線程維護(hù)一棵紅黑樹,其中每個(gè)節(jié)點(diǎn)以線程訪問(wèn)變量地址作為關(guān)鍵值,每個(gè)節(jié)點(diǎn)按時(shí)間順序保存該線程對(duì)該線程訪問(wèn)變量的每一次訪存信息。這樣,我們就能方便地計(jì)算出每個(gè)線程的平均訪存延遲以及每個(gè)線程訪問(wèn)變量的線程平均訪存延遲。在調(diào)度部分,我們可以利用操作系統(tǒng)提供的函數(shù)來(lái)進(jìn)行線程訪問(wèn)變量的拷貝和調(diào)度。
[0060]該調(diào)度方法針對(duì)的是多線程并行執(zhí)行的區(qū)域,其中的采樣、分析、調(diào)度等過(guò)程也都只針對(duì)程序并行執(zhí)行的部分。采樣過(guò)程采集的信息包括發(fā)起訪存行為的線程ID,該訪存行為的目的地址,完成該訪存行為所耗費(fèi)的時(shí)鐘周期數(shù),該訪存行為的類型(遠(yuǎn)端訪存/本地訪存)等。采樣過(guò)程采集的信息還包括變量的內(nèi)存分配行為。當(dāng)多線程程序?yàn)樽兞糠峙鋬?nèi)存時(shí),采樣過(guò)程將會(huì)記錄分配的內(nèi)存大小以及分配的內(nèi)存地址等信息。
[0061]如圖2所示,本發(fā)明提出的基于上述系統(tǒng)的一種NUMA架構(gòu)下平衡多線程間訪存延遲的調(diào)度方法,包括以下步驟:
[0062](I)檢測(cè)模塊檢測(cè)程序是否進(jìn)入多線程并行執(zhí)行區(qū)域,一旦發(fā)現(xiàn)程序處于多線程并行執(zhí)行區(qū)域,立即啟動(dòng)采樣模塊;
[0063](2)采樣模塊持續(xù)對(duì)程序的多線程訪存行為進(jìn)行采樣,并將采樣獲取的訪存信息根據(jù)線程ID進(jìn)行分類并保存(本發(fā)明優(yōu)選使用紅黑樹方式進(jìn)行保存),根據(jù)訪存行為的時(shí)間順序?yàn)槊總€(gè)線程建立一個(gè)訪存事件流,并通過(guò)分析模塊不斷更新計(jì)算每個(gè)線程的平均訪存延遲;其中,所述訪存信息包括發(fā)起訪存行為的線程ID,訪存行為的目的地址,完成訪存行為所耗費(fèi)的時(shí)鐘周期數(shù),訪存行為的類型。
[0064]另外,所述采樣模塊還保存采樣過(guò)程中為線程訪問(wèn)數(shù)據(jù)分配的內(nèi)存大小及分配的內(nèi)存地址;
[0065](3)分析模塊定期對(duì)各線程的訪存延遲不平衡度進(jìn)行評(píng)估,其中,所述訪存延遲不平衡度具體為:
[0066]ξτ= I DT-Davg I /Davg
[0067]其中,ξτ為線程T的訪存延遲不平衡度,Dt為線程T的平均訪存延遲,Davg為所有線程的平均訪存延遲;
[0068](4)通過(guò)判斷模塊判斷各線程的訪存延遲不平衡度是否大于第一閾值Threshhold(該值可取10%_20%,大部分情況下線程的訪存次數(shù)都比較多,所以即使不平衡度在10%-20%之間,最后累積造成各個(gè)線程完成并行區(qū)域工作的時(shí)間差也是會(huì)影響到多線程程序的運(yùn)行性能的。);若是,則跳轉(zhuǎn)至步驟(5),否則,繼續(xù)執(zhí)行步驟(3);
[0069](5)分析模塊對(duì)多線程程序進(jìn)行訪存行為分析,根據(jù)