高性能計(jì)算機(jī)numa感知的線程和內(nèi)存資源優(yōu)化方法與系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開一種高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法與系統(tǒng),該系統(tǒng)包括:運(yùn)行時(shí)環(huán)境探測(cè)模塊,用于探測(cè)計(jì)算結(jié)點(diǎn)的硬件資源、并行進(jìn)程數(shù);計(jì)算資源分配管理模塊,用于為并行進(jìn)程分配計(jì)算資源,建立并行進(jìn)程及線程與處理器核和物理內(nèi)存的映射;并行編程接口及線程綁定模塊,用于提供并行編程接口,根據(jù)映射關(guān)系獲取線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核。還公開一種NUMA感知的多線程內(nèi)存管理器及其多線程內(nèi)存管理方法,該管理器包括:DSM內(nèi)存管理模塊和SMP模塊內(nèi)存池,分別管理MPI進(jìn)程所屬SMP模塊及單個(gè)SMP模塊內(nèi)部的內(nèi)存分配及釋放。可減少內(nèi)存操作的系統(tǒng)調(diào)用次數(shù),提高內(nèi)存管理性能;減少應(yīng)用程序的遠(yuǎn)地訪存行為,提升應(yīng)用程序性能。
【專利說明】高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法與系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)【技術(shù)領(lǐng)域】,尤其涉及高性能計(jì)算機(jī)NUMA (Non-Uniform MemoryAccess,非一致內(nèi)存訪問)感知的線程和內(nèi)存資源優(yōu)化方法與系統(tǒng)。
【背景技術(shù)】
[0002]當(dāng)前,主流的高性能計(jì)算機(jī)結(jié)點(diǎn)大多采用DSM(Distributed Shared Memory,分布式共享存儲(chǔ)結(jié)構(gòu))設(shè)計(jì)。如圖1所示,基于DSM體系結(jié)構(gòu)設(shè)計(jì)的計(jì)算結(jié)點(diǎn),每塊CPU(CenterProcess unit,中央處理單元,及處理器)既可以通過CPU內(nèi)的內(nèi)存控制器訪問自身的內(nèi)存模塊(本地內(nèi)存),也可以通過高速互聯(lián)網(wǎng)絡(luò)訪問其它CPU的內(nèi)存模塊(遠(yuǎn)端內(nèi)存)。訪問遠(yuǎn)端內(nèi)存的代價(jià)高于本地內(nèi)存,在部分系統(tǒng)上甚至高出數(shù)倍,這樣的訪存特性稱為NUMA(Non-Uniform Memory Access,非一致內(nèi)存訪問)。DSM的NUMA特征給應(yīng)用程序,特別是科學(xué)工程計(jì)算領(lǐng)域的應(yīng)用程序帶來(lái)巨大的性能挑戰(zhàn)。
[0003]對(duì)應(yīng)用程序而言,要充分發(fā)揮DSM體系結(jié)構(gòu)的性能,關(guān)鍵在于減少應(yīng)用程序的遠(yuǎn)地訪存行為,提高訪存局部性。然而當(dāng)前的應(yīng)用程序和操作系統(tǒng)存在如下兩方面的缺陷:
[0004]一、操作系統(tǒng)無(wú)法感知應(yīng)用程序的訪存局部性需求
[0005]操作系統(tǒng)對(duì)線程的調(diào)度沒有考慮到應(yīng)用程序的訪存局部性需求,可能會(huì)將執(zhí)行線程調(diào)度到與其內(nèi)存不相鄰的處理器核上,這就可能導(dǎo)致遠(yuǎn)端訪存的發(fā)生,從而降低應(yīng)用程序的執(zhí)行性能。
[0006]二、應(yīng)用程序編程模型內(nèi)存管理無(wú)法做到NUMA感知
[0007]隨著高性能計(jì)算機(jī)規(guī)模的不斷增長(zhǎng),越來(lái)越多的高性能數(shù)值模擬程序采用基于MPI+OpenMP的“結(jié)點(diǎn)間多進(jìn)程并行,結(jié)點(diǎn)內(nèi)多線程并行”嵌套并行編程模型。在這樣的編程模型中,單結(jié)點(diǎn)內(nèi)的多線程并行程序由于共享地址空間而無(wú)法分辨物理內(nèi)存的位置,從而導(dǎo)致遠(yuǎn)程內(nèi)存分配,進(jìn)而造成應(yīng)用程序的性能損失。
[0008]現(xiàn)有技術(shù)中還提出First-Touch內(nèi)存分配策略+Auto-Migrat1n自動(dòng)頁(yè)遷移技術(shù),該技術(shù)實(shí)現(xiàn)為:物理內(nèi)存頁(yè)在首次被訪問時(shí)分配,并盡可能分配在發(fā)起訪問的線程或進(jìn)程所在的CPU本地內(nèi)存上。其中,內(nèi)存頁(yè)是操作系統(tǒng)進(jìn)行內(nèi)存管理的最小粒度。在常見的基于X86處理器的Linux操作系統(tǒng)上,內(nèi)存頁(yè)的大小通常為4KB。如果在一段時(shí)間內(nèi)某個(gè)頁(yè)面總是發(fā)生遠(yuǎn)程訪問,則將該頁(yè)面遷移到發(fā)生訪問的線程運(yùn)行所在的CPU本地內(nèi)存上。然而,該方案存在如下技術(shù)缺陷:
[0009](I)頁(yè)遷移的開銷大,且具有滯后性。
[0010](2) First-Touch內(nèi)存分配策略和Auto-Migrat1n自動(dòng)頁(yè)遷移技術(shù)無(wú)法準(zhǔn)確預(yù)知程序的訪存行為,可能導(dǎo)致不恰當(dāng)?shù)膬?nèi)存遷移,造成應(yīng)用程序的遠(yuǎn)程內(nèi)存訪問。譬如:操作系統(tǒng)將執(zhí)行線程調(diào)度到線程初始執(zhí)行CPU之外的其它CPU核上運(yùn)行,此時(shí)會(huì)產(chǎn)生遠(yuǎn)地訪存行為,經(jīng)過一段時(shí)間的探測(cè)后,自動(dòng)頁(yè)遷移技術(shù)將該內(nèi)存頁(yè)遷移到線程所在CPU的本地內(nèi)存上。如果操作系統(tǒng)再度將相應(yīng)的執(zhí)行線程調(diào)度到別的CPU核上,有可能再次引發(fā)內(nèi)存頁(yè)遷移。來(lái)回的頁(yè)遷移會(huì)極大的增大應(yīng)用程序的訪存開銷,降低應(yīng)用程序執(zhí)行性能。
[0011]現(xiàn)有技術(shù)還提出一種LibNUMA內(nèi)存管理庫(kù)。該方案中,根據(jù)用戶設(shè)定的內(nèi)存親近性策略,調(diào)用相應(yīng)的內(nèi)核態(tài)接口設(shè)置相應(yīng)的內(nèi)存區(qū)的內(nèi)存親近性策略,為用戶分配指定SMP(Symmetrical Mult1-Processing,對(duì)稱多處理器共享存儲(chǔ)結(jié)構(gòu))模塊的內(nèi)存頁(yè)。其中,SMP模塊是在一個(gè)DSM結(jié)點(diǎn)內(nèi)部,由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能。DSM結(jié)點(diǎn)是具有DSM體系結(jié)構(gòu)特征的計(jì)算結(jié)點(diǎn)。LibNUMA內(nèi)存管理庫(kù)對(duì)于內(nèi)存的申請(qǐng)和釋放以操作系統(tǒng)的內(nèi)存管理為基礎(chǔ),采用固定大小的內(nèi)存頁(yè)為基本粒度,例如對(duì)于常見的基于x86處理器的Linux操作系統(tǒng)而言,其內(nèi)存頁(yè)面的大小通常為4KB,如果開啟了 HugePage技術(shù),其內(nèi)存頁(yè)面更是可擴(kuò)大到2MB。然而,仍然存在如下技術(shù)缺陷:
[0012](I)管理粒度較大,不適應(yīng)應(yīng)用程序的細(xì)粒度訪存需求。對(duì)于數(shù)值模擬程序而言,其訪存需求以不定尺寸的內(nèi)存塊(variable size block,由應(yīng)用程序申請(qǐng)的一塊連續(xù)內(nèi)存)為基本單位,這些內(nèi)存塊可以從幾個(gè)Byte到幾個(gè)MB不等,而LibNUMA庫(kù)的最小管理單位為內(nèi)存頁(yè),很多時(shí)候,一個(gè)內(nèi)存頁(yè)的大小可以包含很多個(gè)內(nèi)存塊,如果應(yīng)用程序頻繁的申請(qǐng)細(xì)粒度內(nèi)存,將造成極大的內(nèi)存資源浪費(fèi)。
[0013](2)頻繁調(diào)用會(huì)導(dǎo)致用戶態(tài)與內(nèi)核態(tài)的上下文切換,導(dǎo)致開銷高。LibNUMA的主要功能實(shí)現(xiàn)在內(nèi)核態(tài),如果應(yīng)用程序直接頻繁的調(diào)用LibNUMA接口,將會(huì)導(dǎo)致上下文的切換過于頻繁而使得應(yīng)用程序的執(zhí)行性能大為降低。
【發(fā)明內(nèi)容】
[0014]本發(fā)明實(shí)施例提供一種高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng),用以減少應(yīng)用程序的遠(yuǎn)地訪存行為,提高訪存局部性,該系統(tǒng)包括:
[0015]運(yùn)行時(shí)環(huán)境探測(cè)模塊,用于探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況,探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù);
[0016]計(jì)算資源分配管理模塊,用于根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系;其中,由每個(gè)并行進(jìn)程開啟的并行區(qū)內(nèi)的執(zhí)行線程在該進(jìn)程所屬的處理器核上調(diào)度,各線程的內(nèi)存資源分配請(qǐng)求在線程所屬進(jìn)程的內(nèi)存資源區(qū)域內(nèi)劃分;
[0017]并行編程接口及線程綁定模塊,用于向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上。
[0018]一個(gè)實(shí)施例中,運(yùn)行時(shí)環(huán)境探測(cè)模塊具體用于:
[0019]探測(cè)當(dāng)前計(jì)算結(jié)點(diǎn)包含的對(duì)稱多處理器共享存儲(chǔ)結(jié)構(gòu)SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每塊CPU下掛載的內(nèi)存容量及空閑內(nèi)存信息統(tǒng)計(jì);其中,SMP模塊是由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能;
[0020]運(yùn)行時(shí)環(huán)境探測(cè)模塊具體用于:
[0021]采用共享內(nèi)存通信計(jì)數(shù)的方式獲知以消息傳遞接口 MPI并行方式運(yùn)行于當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)。
[0022]本發(fā)明實(shí)施例還提供一種高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法,用以減少應(yīng)用程序的遠(yuǎn)地訪存行為,提高訪存局部性,該方法包括:
[0023]探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況;
[0024]探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù);
[0025]根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系;其中,由每個(gè)并行進(jìn)程開啟的并行區(qū)內(nèi)的執(zhí)行線程在該進(jìn)程所屬的處理器核上調(diào)度,各線程的內(nèi)存資源分配請(qǐng)求在線程所屬進(jìn)程的內(nèi)存資源區(qū)域內(nèi)劃分;
[0026]向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上。
[0027]—個(gè)實(shí)施例中,探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況,包括:
[0028]探測(cè)當(dāng)前計(jì)算結(jié)點(diǎn)包含的對(duì)稱多處理器共享存儲(chǔ)結(jié)構(gòu)SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每塊CPU下掛載的內(nèi)存容量及空閑內(nèi)存信息統(tǒng)計(jì);其中,SMP模塊是由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能;
[0029]探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),包括:
[0030]采用POSIX共享內(nèi)存寫入的方式統(tǒng)計(jì)當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),對(duì)運(yùn)行于當(dāng)前計(jì)算結(jié)點(diǎn)上的各個(gè)并行進(jìn)程按如下流程執(zhí)行統(tǒng)計(jì)操作:
[0031]初始化進(jìn)程間信號(hào)量;
[0032]并行進(jìn)程搶占信號(hào)量鎖資源,若未搶占到則執(zhí)行等待操作;
[0033]并行進(jìn)程獲得信號(hào)量鎖資源,嘗試創(chuàng)建共享內(nèi)存;
[0034]并行進(jìn)程歸還信號(hào)量鎖資源,讓當(dāng)前計(jì)算結(jié)點(diǎn)上的其它并行進(jìn)程繼續(xù)搶占信號(hào)量鎖資源;
[0035]執(zhí)行全局進(jìn)程同步,確保當(dāng)前計(jì)算結(jié)點(diǎn)內(nèi)的并行進(jìn)程已更新完自己的信息;
[0036]將共享內(nèi)存中的信息拷貝回當(dāng)前進(jìn)程并排序,將排序后的進(jìn)程號(hào)對(duì)應(yīng)的序號(hào)作為該并行進(jìn)程在計(jì)算結(jié)點(diǎn)內(nèi)的ID號(hào);
[0037]回收共享內(nèi)存和信號(hào)量。
[0038]一個(gè)實(shí)施例中,根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系,包括:
[0039]按如下方式計(jì)算并行進(jìn)程能夠創(chuàng)建的一級(jí)并行區(qū)和二級(jí)并行區(qū)內(nèi)的線程數(shù)目以及各線程的綁定位置掩碼:
[0040]獲取用戶的線程分配約束;
[0041]獲取硬件資源信息;
[0042]根據(jù)用戶約束確定計(jì)算資源分配方案:如果用戶指定的二級(jí)并行區(qū)線程數(shù)超過每個(gè)SMP模塊實(shí)際擁有的處理器核數(shù)或者用戶指定的二級(jí)并行區(qū)線程數(shù)小于0,則將二級(jí)并行區(qū)線程數(shù)設(shè)定為每個(gè)SMP模塊實(shí)際擁有的處理器核數(shù)目,否則將二級(jí)并行區(qū)數(shù)目設(shè)置為用戶指定的二級(jí)并行區(qū)線程數(shù)目;如果探測(cè)到當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)超過當(dāng)前計(jì)算結(jié)點(diǎn)實(shí)際擁有的SMP模塊數(shù)目,則將一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)的線程數(shù)目均置為1,以單線程方式執(zhí)行;如果探測(cè)到的當(dāng)前結(jié)點(diǎn)并行進(jìn)程數(shù)小于SMP模塊數(shù),則按照自然序?qū)MP模塊分配給相應(yīng)的并行進(jìn)程,確定該并行進(jìn)程能夠開啟的一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)線程數(shù)目;
[0043]計(jì)算各并行進(jìn)程內(nèi)一級(jí)并行線程和二級(jí)并行線程的綁定位置掩碼:如果按照單線程方式執(zhí)行,則將并行進(jìn)程內(nèi)的一級(jí)并行線程和二級(jí)并行線程按照并行進(jìn)程在當(dāng)前計(jì)算結(jié)點(diǎn)內(nèi)的ID號(hào)設(shè)置相應(yīng)的綁定位置掩碼;如果按照多線程方式執(zhí)行,則為并行進(jìn)程內(nèi)的一級(jí)并行線程和二級(jí)并行線程按照自然序的方式設(shè)置綁定位置掩碼;
[0044]向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上,包括:
[0045]調(diào)用相應(yīng)的并行編程接口,開啟一級(jí)并行區(qū)和二級(jí)并行區(qū);
[0046]查詢當(dāng)前執(zhí)行線程的一級(jí)并行區(qū)ID和二級(jí)并行區(qū)ID ;
[0047]根據(jù)當(dāng)前執(zhí)行線程的一級(jí)并行區(qū)ID和二級(jí)并行區(qū)ID查詢執(zhí)行線程的綁定位置掩碼;
[0048]調(diào)用操作系統(tǒng)提供的線程綁定接口 API,執(zhí)行線程綁定。
[0049]本發(fā)明實(shí)施例還提供一種基于上述高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法創(chuàng)建的NUMA感知的多線程內(nèi)存管理器,用以減少應(yīng)用程序的遠(yuǎn)地訪存行為,提高訪存局部性,該多線程內(nèi)存管理器包括:
[0050]DSM內(nèi)存管理模塊,用于管理MPI進(jìn)程所屬SMP模塊上的內(nèi)存分配及釋放;其中,SMP模塊是由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能;
[0051]SMP模塊內(nèi)存池,用于管理單個(gè)SMP模塊內(nèi)部的內(nèi)存分配及釋放。
[0052]一個(gè)實(shí)施例中,DSM內(nèi)存管理模塊具體用于:處理由SMP模塊內(nèi)存池發(fā)出的內(nèi)存分配請(qǐng)求,調(diào)用操作系統(tǒng)提供的相關(guān)接口分配物理內(nèi)存頁(yè),或,處理由SMP模塊內(nèi)存池發(fā)出的內(nèi)存釋放請(qǐng)求,調(diào)用操作系統(tǒng)提供的相關(guān)接口回收物理內(nèi)存頁(yè);綁定內(nèi)存頁(yè)地址空間到相應(yīng)的SMP模塊;
[0053]SMP模塊內(nèi)存池包括:
[0054]PU (Process Unit,處理單元,及處理器核)空閑塊緩存模塊,用于存儲(chǔ)可供分配給運(yùn)行于當(dāng)前PU上的執(zhí)行線程的空閑塊;處理運(yùn)行于當(dāng)前上的執(zhí)行線程發(fā)出的內(nèi)存申請(qǐng)請(qǐng)求:如果PU空閑塊緩存模塊中有可滿足執(zhí)行線程申請(qǐng)的內(nèi)存塊,則將相應(yīng)內(nèi)存塊分配給相應(yīng)的執(zhí)行線程,否則向空閑塊管理模塊發(fā)出內(nèi)存分配申請(qǐng);
[0055]空閑塊管理模塊,用于處理由空閑塊緩存模塊發(fā)出的內(nèi)存分配申請(qǐng):查找所維護(hù)的空閑塊管理數(shù)據(jù)結(jié)構(gòu),如果能夠滿足PU空閑塊緩存模塊提出的內(nèi)存分配申請(qǐng),則將相應(yīng)的內(nèi)存塊返回給PU空閑塊緩存模塊并將相應(yīng)的內(nèi)存塊從空閑塊管理數(shù)據(jù)結(jié)構(gòu)中剔除,否則向物理頁(yè)面管理模塊發(fā)出內(nèi)存分配申請(qǐng);
[0056]物理頁(yè)面管理模塊,用于管理當(dāng)前SMP模塊上各執(zhí)行線程發(fā)出的內(nèi)存分配及釋放請(qǐng)求;處理空閑塊管理模塊發(fā)出的內(nèi)存分配申請(qǐng)并記錄已分配的內(nèi)存頁(yè)面,并處理各執(zhí)行線程發(fā)出的內(nèi)存分配及釋放請(qǐng)求:查找所管理的連續(xù)空閑內(nèi)存頁(yè),如果能夠滿足空閑塊管理模塊提出的內(nèi)存申請(qǐng)需求,則取出空閑塊管理模塊申請(qǐng)的內(nèi)存頁(yè)面,按照空閑塊管理模塊的要求對(duì)內(nèi)存頁(yè)面進(jìn)行切分并將切分后的內(nèi)存頁(yè)面加入到空閑塊管理模塊,記錄被分配的內(nèi)存頁(yè)面;否則向DSM內(nèi)存管理模塊發(fā)出內(nèi)存分配申請(qǐng)。
[0057]本發(fā)明實(shí)施例還提供一種上述多線程內(nèi)存管理器的多線程內(nèi)存管理方法,用以減少應(yīng)用程序的遠(yuǎn)地訪存行為,提高訪存局部性,該方法包括:
[0058]根據(jù)上述高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法檢測(cè)到的硬件體系結(jié)構(gòu)信息,獲取當(dāng)前DSM結(jié)點(diǎn)上的內(nèi)存資源分布情況:當(dāng)前DSM結(jié)點(diǎn)擁有的SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每個(gè)SMP模塊上的內(nèi)存容量及已分配情況;使得當(dāng)前計(jì)算結(jié)點(diǎn)上的物理內(nèi)存與實(shí)際所屬的SMP模塊逐一對(duì)應(yīng);
[0059]根據(jù)所獲取的內(nèi)存資源分布信息,逐級(jí)創(chuàng)建DSM內(nèi)存管理模塊、物理頁(yè)面管理模塊、空閑塊管理模塊以及PU空閑塊緩存模塊;
[0060]對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求進(jìn)行處理;以及,對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存回收請(qǐng)求進(jìn)行處理。
[0061]一個(gè)實(shí)施例中,根據(jù)所獲取的內(nèi)存資源分布信息,逐級(jí)創(chuàng)建DSM內(nèi)存管理模塊、物理頁(yè)面管理模塊、空閑塊管理模塊以及PU空閑塊緩存模塊,包括:
[0062]創(chuàng)建DSM內(nèi)存管理模塊:使用操作系統(tǒng)提供的NUMA感知API在指定的SMP模塊分配多個(gè)連續(xù)頁(yè)面大小的物理內(nèi)存,并存儲(chǔ)到DSM內(nèi)存管理模塊中;
[0063]創(chuàng)建物理頁(yè)面管理模塊:根據(jù)檢測(cè)到的SMP模塊數(shù)目,為每一個(gè)SMP模塊創(chuàng)建獨(dú)立的物理頁(yè)面管理模塊,記錄由DSM內(nèi)存管理模塊申請(qǐng)的本SMP模塊的物理內(nèi)存頁(yè),并初始化物理內(nèi)存頁(yè)的分配釋放信息;
[0064]創(chuàng)建空閑塊管理模塊:根據(jù)檢測(cè)到的SMP模塊數(shù)目,為每一個(gè)SMP模塊創(chuàng)建獨(dú)立的空閑塊管理模塊,將物理頁(yè)面管理模塊中的內(nèi)存按照既定的塊大小進(jìn)行切分,記錄尚未分配給用戶執(zhí)行線程的內(nèi)存塊;
[0065]創(chuàng)建PU空閑塊緩存模塊:根據(jù)檢測(cè)到的當(dāng)前SMP模塊包含的處理器核數(shù)目,為每一個(gè)處理器核創(chuàng)建獨(dú)立的PU空閑塊緩存模塊,其中空閑塊緩存模塊是對(duì)于可供分配給當(dāng)前PU執(zhí)行線程的內(nèi)存塊的記錄。
[0066]一個(gè)實(shí)施例中,對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求進(jìn)行處理,包括:
[0067]應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存分配請(qǐng)求;
[0068]計(jì)算滿足需求的最優(yōu)內(nèi)存塊大小;
[0069]根據(jù)最優(yōu)內(nèi)存塊大小以及發(fā)起的申請(qǐng)分配內(nèi)存塊數(shù)量,查找I3U空閑塊緩存模塊是否擁有足夠數(shù)量的既定尺寸的內(nèi)存塊,如果查找成功則返回相應(yīng)的內(nèi)存塊給執(zhí)行線程;否則:
[0070]根據(jù)PU空閑塊緩存模塊發(fā)起的申請(qǐng)內(nèi)存塊數(shù)量及尺寸,在空閑塊管理模塊中查找是否擁有滿足條件的既定數(shù)量和既定尺寸的內(nèi)存塊,如果查找成功則返回相應(yīng)的內(nèi)存塊給空閑塊緩存模塊,并將相應(yīng)的內(nèi)存塊從空閑塊管理數(shù)據(jù)結(jié)構(gòu)中刪除;否則:
[0071]空閑塊管理模塊向物理頁(yè)面管理模塊發(fā)出內(nèi)存分配申請(qǐng);
[0072]物理頁(yè)面管理模塊接收到空閑塊管理模塊提出的內(nèi)存分配申請(qǐng),檢查自身管理的空閑內(nèi)存頁(yè)是否能夠滿足空閑塊管理模塊提出的內(nèi)存申請(qǐng)需求,若是則取出空閑塊管理模塊申請(qǐng)的內(nèi)存頁(yè)面,按照空閑塊管理模塊的要求對(duì)內(nèi)存頁(yè)面進(jìn)行切分并將切分后的內(nèi)存頁(yè)面加入到空閑塊管理模塊,記錄被分配的內(nèi)存頁(yè)面;否則:
[0073]物理頁(yè)面管理模塊向DSM內(nèi)存管理模塊發(fā)出內(nèi)存分配申請(qǐng);
[0074]DSM內(nèi)存管理模塊則通過操作系統(tǒng)提供的內(nèi)存分配接口,確定在指定的SMP模塊是否能夠分配相應(yīng)長(zhǎng)度的內(nèi)存,如是則將相應(yīng)內(nèi)存地址空間綁定到相應(yīng)的SMP模塊,同時(shí)將物理內(nèi)存頁(yè)返回給物理頁(yè)面管理模塊,否則報(bào)錯(cuò)退出;
[0075]對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存回收請(qǐng)求進(jìn)行處理,包括:
[0076]應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存釋放請(qǐng)求;
[0077]查找分配相關(guān)內(nèi)存塊的物理頁(yè)面管理模塊;如果相關(guān)內(nèi)存由該SMP模塊所分配,則:將相關(guān)的內(nèi)存塊放入相應(yīng)的執(zhí)行線程所屬的PU空閑塊緩存模塊中;叩空閑塊緩存模塊執(zhí)行空間壓縮操作;空閑塊管理模塊執(zhí)行空間合并操作;物理頁(yè)面管理模塊執(zhí)行空間壓縮操作;DSM內(nèi)存管理模塊返還內(nèi)存給操作系統(tǒng);否則:
[0078]依次查找其它SMP模塊的物理頁(yè)面管理模塊,如果查找到相應(yīng)的SMP模塊,則返還內(nèi)存塊到相應(yīng)SMP模塊的空閑塊管理模塊;否則通知應(yīng)用程序內(nèi)存釋放異常。
[0079]本發(fā)明實(shí)施例的高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)和方法可以解決操作系統(tǒng)對(duì)應(yīng)用程序執(zhí)行線程調(diào)度的盲目性,規(guī)避遠(yuǎn)地訪存行為。NUMA感知的多線程內(nèi)存管理器及多線程內(nèi)存管理方法可以解決應(yīng)用程序編程模型內(nèi)存分配無(wú)法做到NUMA感知的問題,滿足內(nèi)存分配局部化的需求,提高訪存局部性;解決First-Touch內(nèi)存分配策略和Auto-Migrat1n自動(dòng)頁(yè)遷移技術(shù)無(wú)法準(zhǔn)確預(yù)知程序的訪存行為的問題,從應(yīng)用程序內(nèi)部發(fā)起訪存需求,并通過運(yùn)行時(shí)環(huán)境滿足應(yīng)用程序的本地化訪存需求;解決操作系統(tǒng)對(duì)內(nèi)存管理粒度過大的問題,滿足應(yīng)用程序的細(xì)粒度訪存需求;進(jìn)一步的,還通過快速內(nèi)存分配和回收解決現(xiàn)有NUMA感知內(nèi)存調(diào)用接口開銷聞的問題,減少系統(tǒng)調(diào)用次數(shù),提聞內(nèi)存管理性能。
【專利附圖】
【附圖說明】
[0080]為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。在附圖中:
[0081 ] 圖1為現(xiàn)有技術(shù)中DSM體系結(jié)構(gòu)不意圖;
[0082]圖2為本發(fā)明實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)的示意圖;
[0083]圖3為本發(fā)明實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法的示意圖;
[0084]圖4為本發(fā)明實(shí)施例中NUMA感知的多線程內(nèi)存管理器的示意圖;
[0085]圖5為本發(fā)明實(shí)施例中NUMA感知的多線程內(nèi)存管理器的多線程內(nèi)存管理方法的示意圖;
[0086]圖6為本發(fā)明實(shí)施例中NUMA感知的多線程內(nèi)存快速分配方法示意圖;
[0087]圖1為本發(fā)明實(shí)施例中NUMA感知的多線程內(nèi)存高效回收方法示意圖。
【具體實(shí)施方式】
[0088]為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下面結(jié)合附圖對(duì)本發(fā)明實(shí)施例做進(jìn)一步詳細(xì)說明。在此,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,但并不作為對(duì)本發(fā)明的限定。
[0089]為解決現(xiàn)有技術(shù)中存在的問題,本發(fā)明實(shí)施例提出一種面向高性能計(jì)算機(jī)結(jié)點(diǎn)內(nèi)NUMA感知的線程和內(nèi)存資源優(yōu)化技術(shù),包括高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)和方法、基于高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法創(chuàng)建的NUMA感知的多線程內(nèi)存管理器及其多線程內(nèi)存管理方法。一方面將并行進(jìn)程、一級(jí)并行區(qū)線程、二級(jí)并行區(qū)線程與DSM結(jié)點(diǎn)的硬件體系結(jié)構(gòu)特征逐一映射,限定各執(zhí)行線程的運(yùn)行處理器核,規(guī)避由于操作系統(tǒng)調(diào)度導(dǎo)致的線程遷移,進(jìn)而減少不必要的遠(yuǎn)地訪存行為;另一方面滿足應(yīng)用程序?qū)UMA感知的多線程內(nèi)存管理器的需求,將各執(zhí)行線程的內(nèi)存分配精確控制在執(zhí)行線程所在CPU的本地內(nèi)存上,有效提高內(nèi)存分配的局部性。從而提高應(yīng)用程序的訪存局部性,充分發(fā)揮DSM體系結(jié)構(gòu)的性能。
[0090]圖2為本發(fā)明實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)的示意圖。如圖2所示,本發(fā)明實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)將“并行進(jìn)程”、“一級(jí)并行區(qū)執(zhí)行線程”、“二級(jí)并行區(qū)執(zhí)行線程”與DSM體系結(jié)構(gòu)特征緊密結(jié)合,建立“并行進(jìn)程”、“一級(jí)并行區(qū)執(zhí)行線程”、“二級(jí)并行區(qū)執(zhí)行線程”到“DSM結(jié)點(diǎn)”、“SMP模塊”以及“PU處理單元(即處理器核)”的映射,并為應(yīng)用程序提供NUMA感知的并行編程接口。本發(fā)明實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng),包含“運(yùn)行時(shí)環(huán)境探測(cè)模塊”、“計(jì)算資源分配管理模塊”以及“并行編程接口及線程綁定模塊”。
[0091]其中,運(yùn)行時(shí)環(huán)境探測(cè)模塊具有兩方面的功能:
[0092](I)探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及其分布情況。具體而言,可以探測(cè)當(dāng)前計(jì)算結(jié)點(diǎn)包含幾個(gè)SMP模塊,每個(gè)SMP模塊上有幾塊CPU,每塊CPU有幾個(gè)處理器核,每塊CPU下掛載的內(nèi)存容量及空閑內(nèi)存信息統(tǒng)計(jì)。其中的SMP模塊是指由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能。
[0093](2)探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)。在實(shí)施例中,并行程序以MPI并行方式在高性能計(jì)算機(jī)上運(yùn)行,每個(gè)計(jì)算結(jié)點(diǎn)上可能存在該并行程序的一個(gè)或多個(gè)MPI進(jìn)程,該步驟可以探明程序在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)。需要指出的是,并行進(jìn)程采用MPI并行的方式僅為一例,實(shí)施時(shí)也可以采用其它并行方式;探測(cè)并行進(jìn)程數(shù)的技術(shù)手段包括采用共享內(nèi)存通信計(jì)數(shù)的方式獲知運(yùn)行于當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),實(shí)施時(shí)也可以采用其它探測(cè)并行進(jìn)程數(shù)的技術(shù)。
[0094]計(jì)算資源分配管理模塊,用于根據(jù)運(yùn)行時(shí)環(huán)境探測(cè)模塊獲知的計(jì)算結(jié)點(diǎn)資源分布情況以及并行進(jìn)程數(shù)目,為各并行進(jìn)程分配處理器和內(nèi)存等計(jì)算資源,建立各并行進(jìn)程及其子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系;其中,由每個(gè)并行進(jìn)程開啟的并行區(qū)內(nèi)的執(zhí)行線程只會(huì)在本進(jìn)程所屬的處理器核上調(diào)度,各線程的內(nèi)存資源分配請(qǐng)求也只在線程所屬進(jìn)程的內(nèi)存資源區(qū)域內(nèi)劃分。
[0095]并行編程接口及線程綁定模塊,用于向并行程序提供相應(yīng)的并行編程接口開啟和關(guān)閉并行區(qū),在應(yīng)用程序調(diào)用相應(yīng)的并行編程接口之后,根據(jù)計(jì)算資源分配管理模塊返回的映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上,從而限定該執(zhí)行線程的可調(diào)度范圍,避免操作系統(tǒng)的盲目調(diào)度產(chǎn)生的線程遷移。
[0096]實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法如下:
[0097]探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況;
[0098]探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù);
[0099]根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系;其中,由每個(gè)并行進(jìn)程開啟的并行區(qū)內(nèi)的執(zhí)行線程在該進(jìn)程所屬的處理器核上調(diào)度,各線程的內(nèi)存資源分配請(qǐng)求在線程所屬進(jìn)程的內(nèi)存資源區(qū)域內(nèi)劃分;
[0100]向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上。
[0101]下面舉例說明本發(fā)明實(shí)施例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法的具體實(shí)施。圖3為本例中高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法的示意圖。如圖3所示,方法中可以包括:
[0102]步驟101、計(jì)算結(jié)點(diǎn)硬件資源探測(cè)。具體而言,包括探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及硬件資源的分布情況,即探測(cè)計(jì)算結(jié)點(diǎn)的處理器和內(nèi)存資源分布情況。例如,包括當(dāng)前計(jì)算結(jié)點(diǎn)包含幾個(gè)SMP模塊,每個(gè)SMP模塊上有幾塊CPU,每塊CPU有幾個(gè)處理器核,每個(gè)SMP模塊上掛載的內(nèi)存容量及空閑內(nèi)存信息統(tǒng)計(jì)。例如:對(duì)于一個(gè)典型的雙路8核16GB內(nèi)存的DSM計(jì)算結(jié)點(diǎn),可以從操作系統(tǒng)獲知當(dāng)前結(jié)點(diǎn)包含2個(gè)SMP模塊,每個(gè)SMP模塊上具有I塊CPU,每塊CPU擁有4處理器核,并且在每個(gè)SMP模塊上掛載了 8GB內(nèi)存,進(jìn)一步地可獲知每個(gè)SMP模塊上的內(nèi)存分配情況并逐一進(jìn)行記錄。
[0103]步驟102、運(yùn)行時(shí)環(huán)境初始化。具體而言,包括探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),即,探測(cè)當(dāng)前應(yīng)用程序處于同一計(jì)算結(jié)點(diǎn)的并行進(jìn)程數(shù)。例如,采用POSIX共享內(nèi)存寫入的方式統(tǒng)計(jì)當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),運(yùn)行于當(dāng)前計(jì)算結(jié)點(diǎn)上的各個(gè)并行進(jìn)程可采用如下流程執(zhí)行統(tǒng)計(jì)操作:
[0104]1、初始化進(jìn)程間信號(hào)量;
[0105]2、并行進(jìn)程搶占信號(hào)量鎖資源,若未搶占到則執(zhí)行等待操作;
[0106]3、并行進(jìn)程獲得信號(hào)量鎖資源,嘗試創(chuàng)建共享內(nèi)存:
[0107]若共享內(nèi)存未創(chuàng)建,則申請(qǐng)共享內(nèi)存;
[0108]若共享內(nèi)存已分配,則直接獲取共享內(nèi)存;
[0109]設(shè)置共享內(nèi)存長(zhǎng)度,映射內(nèi)存空間;
[0110]如果當(dāng)前進(jìn)程是創(chuàng)建共享內(nèi)存的進(jìn)程,初始化共享內(nèi)存中的值;
[0111]將當(dāng)前并行進(jìn)程的進(jìn)程號(hào)寫入共享內(nèi)存,增加計(jì)數(shù)器;
[0112]4、并行進(jìn)程歸還信號(hào)量鎖資源,讓當(dāng)前計(jì)算結(jié)點(diǎn)上的其它并行進(jìn)程繼續(xù)搶占信號(hào)量鎖資源;
[0113]5、執(zhí)行全局進(jìn)程同步,確保當(dāng)前計(jì)算結(jié)點(diǎn)內(nèi)的并行進(jìn)程已更新完自己的信息;
[0114]6、將共享內(nèi)存中的信息拷貝回當(dāng)前進(jìn)程并排序,排序后的進(jìn)程號(hào)對(duì)應(yīng)的序號(hào)即為該并行進(jìn)程在計(jì)算結(jié)點(diǎn)內(nèi)的ID號(hào);
[0115]7、回收共享內(nèi)存和信號(hào)量。
[0116]步驟103、計(jì)算資源分配及映射。即,具體而言,包括根據(jù)硬件資源的分布情況及并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系。實(shí)施例中可以計(jì)算并行進(jìn)程可創(chuàng)建的一級(jí)并行區(qū)和二級(jí)并行區(qū)內(nèi)的線程數(shù)目以及各線程的綁定位置掩碼,為DSM結(jié)點(diǎn)內(nèi)開啟兩級(jí)嵌套并行環(huán)境做準(zhǔn)備。具體而言,包括如下步驟:
[0117]1、獲取用戶的線程分配約束:記錄由用戶指定的一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)線程數(shù)目;
[0118]2、獲取硬件資源信息:包括當(dāng)前計(jì)算結(jié)點(diǎn)上的SMP模塊數(shù)、每個(gè)SMP模塊上的處理器核數(shù)目、當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù);
[0119]3、根據(jù)用戶約束確定計(jì)算資源分配方案:
[0120]如果用戶指定的二級(jí)并行區(qū)線程數(shù)超過了每個(gè)SMP模塊實(shí)際擁有的處理器核數(shù)或者用戶指定的二級(jí)并行區(qū)線程數(shù)小于0,則將二級(jí)并行區(qū)線程數(shù)設(shè)定為每個(gè)SMP模塊實(shí)際擁有的處理器核數(shù)目;否則將二級(jí)并行區(qū)數(shù)目設(shè)置為用戶指定的二級(jí)并行區(qū)線程數(shù)目;
[0121]如果探測(cè)到當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)超過了當(dāng)前計(jì)算結(jié)點(diǎn)實(shí)際擁有的SMP模塊數(shù)目,則無(wú)法做到將并行進(jìn)程、一級(jí)并行線程、二級(jí)并行線程逐級(jí)映射到硬件資源而不破壞NUMA感知,此時(shí)將一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)的線程數(shù)目均置為1,以單線程方式執(zhí)行;
[0122]如果探測(cè)到的當(dāng)前結(jié)點(diǎn)并行進(jìn)程數(shù)小于SMP模塊數(shù),則按照自然序?qū)MP模塊分配給相應(yīng)的并行進(jìn)程,確定該并行進(jìn)程可開啟的一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)線程數(shù)目;
[0123]4、計(jì)算各并行進(jìn)程內(nèi)一級(jí)并行線程和二級(jí)并行線程的綁定位置掩碼:
[0124]如果按照單線程方式執(zhí)行,則將并行進(jìn)程內(nèi)的一級(jí)并行線程和二級(jí)并行線程按照并行進(jìn)程在當(dāng)前計(jì)算結(jié)點(diǎn)內(nèi)的ID號(hào)設(shè)置相應(yīng)的綁定位置掩碼,此時(shí)的一級(jí)并行線程和二級(jí)并行線程數(shù)目均為I,且綁定到相同的處理器核上;
[0125]如果按照多線程方式執(zhí)行,則為并行進(jìn)程內(nèi)的一級(jí)并行線程和二級(jí)并行線程按照自然序的方式設(shè)置綁定位置掩碼。例如針對(duì)前述兩路8核計(jì)算結(jié)點(diǎn),假設(shè)在該結(jié)點(diǎn)上有一個(gè)MPI進(jìn)程運(yùn)行,則可將此MPI進(jìn)程的一級(jí)并行區(qū)線程數(shù)設(shè)置為2 (對(duì)應(yīng)兩個(gè)SMP模塊),二級(jí)并行區(qū)線程數(shù)最大可設(shè)置為4 (對(duì)應(yīng)每個(gè)SMP模塊上的4個(gè)處理器核),一級(jí)并行區(qū)的O號(hào)線程綁定位置掩碼對(duì)應(yīng)第O號(hào)處理器核,由該一級(jí)并行區(qū)開啟的二級(jí)并行區(qū)線程,相應(yīng)的綁定位置掩碼可分別對(duì)應(yīng)第0、1、2、3號(hào)處理器核,以此類推可以計(jì)算出一級(jí)并行區(qū)I號(hào)線程的綁定位置掩碼一級(jí)由之開啟的二級(jí)并行區(qū)線程綁定位置掩碼。
[0126]步驟104、并行編程接口調(diào)用及線程綁定,包括:向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上。實(shí)施例中,在應(yīng)用程序中調(diào)用相應(yīng)的并行編程接口之后,執(zhí)行相應(yīng)的綁定操作,具體而言,包括如下步驟:
[0127]1、用戶調(diào)用相應(yīng)的并行編程接口,開啟一級(jí)并行區(qū)和二級(jí)并行區(qū);
[0128]2、查詢當(dāng)前執(zhí)行線程的一級(jí)并行區(qū)ID和二級(jí)并行區(qū)ID ;
[0129]3、根據(jù)當(dāng)前執(zhí)行線程的一級(jí)并行區(qū)ID和二級(jí)并行區(qū)ID查詢執(zhí)行線程的綁定位置掩碼;
[0130]4、調(diào)用操作系統(tǒng)提供的線程綁定接口 API,執(zhí)行線程綁定。這里所指的線程綁定接口 API,可以是 pthread_setaffinity_np O、sched_setaffinity O 等接口。
[0131]如上所述,本發(fā)明實(shí)施例的高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)及方法,即可實(shí)現(xiàn)應(yīng)用程序并行進(jìn)程、一級(jí)并行區(qū)、二級(jí)并行區(qū)與高性能計(jì)算結(jié)點(diǎn)體系結(jié)構(gòu)特征的逐一映射。
[0132]基于上述高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法,本發(fā)明實(shí)施例還提供一種NUMA感知的多線程內(nèi)存管理器。圖4為本發(fā)明實(shí)施例中NUMA感知的多線程內(nèi)存管理器的示意圖,如圖4所示,本發(fā)明實(shí)施例中NUMA感知的多線程內(nèi)存管理器包括:
[0133]DSM內(nèi)存管理模塊,用于管理MPI進(jìn)程所屬SMP模塊上的內(nèi)存分配、內(nèi)存釋放。具體的,DSM內(nèi)存管理模塊可以用于負(fù)責(zé)處理由SMP模塊內(nèi)存池發(fā)出的內(nèi)存分配、內(nèi)存釋放請(qǐng)求,并調(diào)用操作系統(tǒng)提供的相關(guān)接口實(shí)際分配、回收物理內(nèi)存頁(yè),綁定內(nèi)存頁(yè)地址空間到相應(yīng)的SMP模塊,從而滿足SMP模塊內(nèi)存池的本地化內(nèi)存分配請(qǐng)求。
[0134]SMP模塊內(nèi)存池,用于管理單個(gè)SMP模塊內(nèi)部的內(nèi)存分配及釋放。
[0135]具體實(shí)施時(shí),SMP模塊內(nèi)存池可以包含“PU空閑塊緩存模塊”、“空閑塊管理模塊”以及“物理頁(yè)面管理模塊”三級(jí)子模塊:
[0136]PU空閑塊緩存模塊,用于存儲(chǔ)可供分配給運(yùn)行于當(dāng)前上的執(zhí)行線程的空閑塊,該模塊直接處理運(yùn)行于當(dāng)前PU上的執(zhí)行線程發(fā)出的內(nèi)存申請(qǐng)請(qǐng)求。如果PU空閑塊緩存模塊中具有可滿足執(zhí)行線程申請(qǐng)的內(nèi)存塊,則直接將相應(yīng)內(nèi)存塊分配給相應(yīng)的執(zhí)行線程,否則就向空閑塊管理模塊發(fā)出內(nèi)存分配申請(qǐng),由空閑塊管理模塊進(jìn)一步處理執(zhí)行線程的內(nèi)存分配請(qǐng)求。
[0137]空閑塊管理模塊,用于處理由空閑塊緩存模塊發(fā)出的內(nèi)存分配申請(qǐng)。該模塊首先查找自身維護(hù)的空閑塊管理數(shù)據(jù)結(jié)構(gòu),如果能夠滿足PU空閑塊緩存模塊提出的內(nèi)存分配申請(qǐng),則直接將相應(yīng)的內(nèi)存塊返回給PU空閑塊緩存模塊并將相應(yīng)的內(nèi)存塊從空閑塊管理數(shù)據(jù)結(jié)構(gòu)中剔除。否則由空閑塊管理模塊向物理頁(yè)面管理模塊發(fā)出申請(qǐng),由物理頁(yè)面管理模塊進(jìn)一步處理執(zhí)行線程的內(nèi)存分配請(qǐng)求。
[0138]物理頁(yè)面管理模塊,用于總體管理當(dāng)前SMP模塊上各執(zhí)行線程發(fā)出的內(nèi)存分配及釋放請(qǐng)求。該模塊直接處理空閑塊管理模塊發(fā)出的內(nèi)存分配申請(qǐng)并記錄已分配的內(nèi)存頁(yè)面,并處理各執(zhí)行線程發(fā)出內(nèi)存釋放請(qǐng)求。當(dāng)空閑塊管理模塊發(fā)出內(nèi)存分配申請(qǐng)之后,物理頁(yè)面管理模塊首先查找自身管理的連續(xù)空閑內(nèi)存頁(yè),是否能夠滿足空閑塊管理模塊提出的內(nèi)存申請(qǐng)需求。如果能夠滿足,則從中取出空閑塊管理模塊申請(qǐng)的內(nèi)存頁(yè)面,按照空閑塊管理模塊的要求對(duì)內(nèi)存頁(yè)面進(jìn)行切分并將其加入到空閑塊管理模塊,同時(shí)記錄這些被分配的內(nèi)存頁(yè)面;否則由物理頁(yè)面管理模塊向DSM內(nèi)存管理模塊發(fā)出申請(qǐng),分配足夠數(shù)量的綁定到當(dāng)前SMP模塊的內(nèi)存,從而滿足執(zhí)行線程的本地化內(nèi)存分配請(qǐng)求。
[0139]由此可見,本發(fā)明實(shí)施例的NUMA感知的多線程內(nèi)存管理器采用“DSM內(nèi)存管理模塊”、“SMP模塊內(nèi)存池”以及“TO空閑塊緩存模塊”三級(jí)管理結(jié)構(gòu),與高性能計(jì)算機(jī)結(jié)點(diǎn)內(nèi)硬件體系結(jié)構(gòu)的“DSM計(jì)算結(jié)點(diǎn)”、“SMP模塊”、“PU處理單元”逐級(jí)對(duì)應(yīng)。
[0140]本發(fā)明實(shí)施例中多線程內(nèi)存管理器的多線程內(nèi)存管理方法如下:
[0141]根據(jù)上述高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法檢測(cè)到的硬件體系結(jié)構(gòu)信息,獲取當(dāng)前DSM結(jié)點(diǎn)上的內(nèi)存資源分布情況:當(dāng)前DSM結(jié)點(diǎn)擁有的SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每個(gè)SMP模塊上的內(nèi)存容量及已分配情況;使得當(dāng)前計(jì)算結(jié)點(diǎn)上的物理內(nèi)存與實(shí)際所屬的SMP模塊逐一對(duì)應(yīng);
[0142]根據(jù)所獲取的內(nèi)存資源分布信息,逐級(jí)創(chuàng)建DSM內(nèi)存管理模塊、物理頁(yè)面管理模塊、空閑塊管理模塊以及PU空閑塊緩存模塊;
[0143]對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求進(jìn)行處理;以及,對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存回收請(qǐng)求進(jìn)行處理。
[0144]下面舉例說明多線程內(nèi)存管理器的多線程內(nèi)存管理方法的具體實(shí)施。圖5為多線程內(nèi)存管理方法的示意圖,如圖5所示,包括:
[0145]步驟201、DSM結(jié)點(diǎn)內(nèi)存資源分布探測(cè),具體包括:根據(jù)本發(fā)明實(shí)施例提出的高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法檢測(cè)到的硬件體系結(jié)構(gòu)信息,獲取當(dāng)前DSM結(jié)點(diǎn)上的內(nèi)存資源分布情況。具體而言包括當(dāng)前DSM結(jié)點(diǎn)擁有幾個(gè)SMP模塊,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每個(gè)SMP模塊上的內(nèi)存容量及已分配情況。使得當(dāng)前計(jì)算結(jié)點(diǎn)上的物理內(nèi)存與實(shí)際所屬的SMP模塊逐一對(duì)應(yīng),為NUMA感知的內(nèi)存管理奠定基礎(chǔ)。
[0146]步驟202、NUMA感知的內(nèi)存池?cái)?shù)據(jù)結(jié)構(gòu)初始化,具體可以包括根據(jù)步驟201所獲取的內(nèi)存資源分布信息,逐級(jí)創(chuàng)建DSM內(nèi)存管理模塊、物理頁(yè)面管理模塊、空閑塊管理模塊以及空閑塊緩存模塊,關(guān)于各模塊的功能已在上述實(shí)施例中進(jìn)行說明,此處不再贅述,實(shí)施例中具體步驟可以如下:
[0147]創(chuàng)建DSM內(nèi)存管理模塊:使用操作系統(tǒng)提供的NUMA感知API在指定的SMP模塊分配若干連續(xù)頁(yè)面大小的物理內(nèi)存,并存儲(chǔ)到DSM內(nèi)存管理模塊中。其中的NUMA感知API包括first-touch、Iibnuma提供的內(nèi)存分配接口等接口。
[0148]創(chuàng)建物理頁(yè)面管理模塊:根據(jù)本發(fā)明實(shí)施例中圖3所示步驟101中檢測(cè)到的SMP模塊數(shù)目,為每一個(gè)SMP模塊創(chuàng)建獨(dú)立的物理頁(yè)面管理模塊,記錄由DSM內(nèi)存管理模塊申請(qǐng)的本SMP模塊的物理內(nèi)存頁(yè),并初始化物理內(nèi)存頁(yè)的分配釋放信息。
[0149]創(chuàng)建空閑塊管理模塊:根據(jù)本發(fā)明實(shí)施例中圖3所示步驟101中檢測(cè)到的SMP模塊數(shù)目,為每一個(gè)SMP模塊創(chuàng)建獨(dú)立的空閑塊管理模塊,將物理頁(yè)面管理模塊中的內(nèi)存按照既定的塊大小進(jìn)行切分,記錄尚未分配給用戶執(zhí)行線程的內(nèi)存塊。
[0150]創(chuàng)建空閑塊緩存模塊:根據(jù)本發(fā)明實(shí)施例中圖3所示步驟101中檢測(cè)到的當(dāng)前SMP模塊包含的處理器核數(shù)目,為每一個(gè)處理器核創(chuàng)建獨(dú)立的PU空閑塊緩存模塊。其中I3U空閑塊緩存模塊是指對(duì)于可供分配給當(dāng)前PU執(zhí)行線程的內(nèi)存塊的記錄。
[0151]至此,NUMA感知的多線程內(nèi)存管理器已經(jīng)準(zhǔn)備就緒,等待用戶執(zhí)行線程發(fā)起內(nèi)存分配請(qǐng)求和內(nèi)存回收請(qǐng)求,相應(yīng)地,由步驟203-1所述的NUMA感知的多線程內(nèi)存快速分配方法對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求進(jìn)行處理,由步驟203-2所述的NUMA感知的多線程內(nèi)存高效回收方法對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存回收請(qǐng)求進(jìn)行處理。
[0152]其中步驟203-1所述的NUMA感知的多線程內(nèi)存快速分配方法,是依賴“TO空閑塊緩存模塊”、“SMP模塊內(nèi)存池”以及“DSM內(nèi)存管理模塊”三級(jí)管理結(jié)構(gòu)實(shí)現(xiàn)的多線程內(nèi)存分配方法。實(shí)施例中可以具體包括如圖6所示的步驟,舉例如下:
[0153]步驟301、應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存分配請(qǐng)求。
[0154]步驟302、計(jì)算滿足需求的最優(yōu)內(nèi)存塊大小。具體可以包括空閑塊緩存模塊中的內(nèi)存塊大小是按照既定尺寸組織管理,如1KB,2KB,4KB,8KB,16KB等。在應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存分配請(qǐng)求之后,內(nèi)存管理模塊首先計(jì)算能夠滿足需求的最優(yōu)內(nèi)存塊的大小,例如用戶程序申請(qǐng)分配3KB的內(nèi)存,則結(jié)合空閑塊緩存模塊中的既定尺寸管理標(biāo)準(zhǔn),選定4KB的內(nèi)存塊大小以滿足應(yīng)用程序執(zhí)行線程的內(nèi)存分配請(qǐng)求。
[0155]步驟303、查找PU空閑塊緩存模塊是否擁有足夠數(shù)量的既定尺寸的內(nèi)存塊。具體可以包括根據(jù)步驟302計(jì)算出的最優(yōu)內(nèi)存塊大小以及步驟301中發(fā)起的申請(qǐng)分配內(nèi)存塊數(shù)量,在PU空閑塊緩存模塊中進(jìn)行查找。如果查找成功則執(zhí)行步驟304,否則執(zhí)行步驟305。
[0156]步驟304、返回內(nèi)存塊給執(zhí)行線程。具體可以包括如果步驟303的查找中檢索到足夠數(shù)量的滿足條件的內(nèi)存塊,則將相應(yīng)的內(nèi)存塊返回給執(zhí)行線程使用。
[0157]步驟305、查找空閑塊管理模塊。具體可以包括根據(jù)空閑塊緩存模塊發(fā)起的申請(qǐng)內(nèi)存塊數(shù)量及尺寸,在空閑塊管理模塊中查找是否擁有滿足條件的既定數(shù)量和既定尺寸的內(nèi)存塊。如果查找成功則執(zhí)行步驟306,否則執(zhí)行步驟307。例如:某空閑塊緩存模塊向空閑塊管理模塊申請(qǐng)分配5個(gè)4KB的內(nèi)存塊。則在空閑塊管理模塊中查找是否具備足夠數(shù)量的內(nèi)存塊并根據(jù)查找結(jié)果執(zhí)行步驟306或者307。
[0158]步驟306、返回內(nèi)存塊給空閑塊緩存模塊。具體可以包括在對(duì)空閑塊管理模塊的查找成功之后,將一定數(shù)量的既定尺寸的內(nèi)存塊加入到PU空閑塊緩存模塊,并將這些內(nèi)存塊從空閑塊管理數(shù)據(jù)結(jié)構(gòu)中刪除,然后再返回步驟303查找PU空閑塊緩存模塊。例如:如果空閑塊管理模塊查找成功返回,則將步驟305申請(qǐng)的5個(gè)4KB的內(nèi)存塊返回給I3U空閑塊緩存模塊,并將這5個(gè)4KB的內(nèi)存塊從空閑塊管理模塊中剔除,然后執(zhí)行步驟303。
[0159]步驟307、查找物理頁(yè)面管理模塊。具體可以包括在步驟305的查找失敗之后,由空閑塊管理模塊向物理頁(yè)面管理模塊發(fā)出內(nèi)存分配申請(qǐng)。例如:如果空閑塊管理模塊查找失敗,則由空閑管理模塊向物理頁(yè)面管理模塊發(fā)出申請(qǐng),申請(qǐng)20個(gè)4KB的內(nèi)存塊,然后重復(fù)執(zhí)行步驟305。多申請(qǐng)的內(nèi)存塊是為其它I3U空閑塊緩存模塊提出內(nèi)存分配申請(qǐng)做準(zhǔn)備,以減少頻繁的向物理頁(yè)面管理模塊發(fā)出內(nèi)存分配申請(qǐng)。物理頁(yè)面管理模塊接到空閑塊管理模塊提出的內(nèi)存分配申請(qǐng)(共計(jì)80KB)之后,首先檢查自身管理的空閑內(nèi)存頁(yè)是否具備80KB的空閑內(nèi)存頁(yè),并根據(jù)檢查結(jié)果執(zhí)行步驟308或者步驟309。
[0160]步驟308、返回內(nèi)存塊給空閑塊管理模塊。具體可以包括:物理頁(yè)面管理模塊在對(duì)自身管轄的空閑內(nèi)存頁(yè)檢查成功返回之后,將空閑塊管理模塊申請(qǐng)的連續(xù)頁(yè)面切出,記錄物理頁(yè)面管理模塊剩余的連續(xù)頁(yè)面,按照PU空閑塊緩存模塊申請(qǐng)的尺寸大小進(jìn)行切分并放入空閑塊管理模塊,然后重復(fù)執(zhí)行步驟305。例如:步驟307中空閑塊管理模塊申請(qǐng)分配80KB的連續(xù)內(nèi)存,則物理頁(yè)面管理模塊從空閑內(nèi)存頁(yè)中切出80KB的內(nèi)存頁(yè),并按照每個(gè)內(nèi)存塊4KB的尺寸進(jìn)行切分,返回20個(gè)4KB大小的內(nèi)存塊給空閑塊管理模塊,同時(shí)記錄這20個(gè)4KB大小的內(nèi)存塊為已分配狀態(tài)。
[0161]步驟309、查找DSM內(nèi)存管理模塊。具體可以包括物理頁(yè)面管理模塊在對(duì)自身管轄的空閑內(nèi)存頁(yè)檢查失敗之后,向DSM內(nèi)存管理模塊申請(qǐng)分配一塊位于本SMP模塊下的連續(xù)空閑內(nèi)存。根據(jù)本步驟的執(zhí)行返回結(jié)果,選擇執(zhí)行步驟310或者311。例如:物理頁(yè)面管理模塊查找自身管理的連續(xù)空閑內(nèi)存時(shí)發(fā)現(xiàn)不具備80KB的連續(xù)內(nèi)存,則向DSM內(nèi)存管理模塊申請(qǐng)IMB大小的位于本SMP模塊的空閑內(nèi)存頁(yè)。同理,這里申請(qǐng)更大的空閑內(nèi)存是為將來(lái)滿足空閑塊管理模塊發(fā)起的其它尺寸的內(nèi)存分配申請(qǐng)做準(zhǔn)備。DSM內(nèi)存管理模塊則通過操作系統(tǒng)提供的內(nèi)存分配接口,在指定的SMP模塊分配相應(yīng)長(zhǎng)度的內(nèi)存。
[0162]步驟310、分配物理內(nèi)存頁(yè)給物理頁(yè)面管理模塊。具體可以包括步驟309中通過DSM內(nèi)存管理模塊成功分配到相應(yīng)長(zhǎng)度的內(nèi)存之后,將相應(yīng)內(nèi)存地址空間綁定到相應(yīng)的SMP模塊,同時(shí)將物理內(nèi)存頁(yè)返回給物理頁(yè)面管理模塊,然后重復(fù)執(zhí)行步驟307。
[0163]步驟311、報(bào)錯(cuò)退出。具體可以包括步驟309中通過DSM內(nèi)存管理模塊分配相應(yīng)長(zhǎng)度的內(nèi)存失敗之后,將相應(yīng)的失敗原因反饋給應(yīng)用程序并進(jìn)行出錯(cuò)處理。失敗的原因可能是執(zhí)行線程申請(qǐng)的空閑內(nèi)存過大導(dǎo)致在指定的SMP結(jié)點(diǎn)上沒有足夠的空閑內(nèi)存可以滿足內(nèi)存分配請(qǐng)求等。
[0164]其中步驟203-2所述的NUMA感知的多線程內(nèi)存高效回收方法,是依賴“TO空閑塊緩存模塊”、“SMP模塊內(nèi)存池”以及“DSM內(nèi)存管理模塊”三級(jí)管理結(jié)構(gòu)實(shí)現(xiàn)的多線程內(nèi)存回收方法。實(shí)施例中可以具體包括如圖7所示的步驟,例如:
[0165]步驟401、應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存釋放請(qǐng)求。
[0166]步驟402、查找分配相關(guān)內(nèi)存塊的物理頁(yè)面管理模塊。即查找線程所在SMP模塊的物理頁(yè)面管理模塊。具體可以包括通過物理頁(yè)面管理模塊中記錄的已分配內(nèi)存頁(yè)表,確定相關(guān)內(nèi)存是否由該SMP模塊分配。如果相關(guān)內(nèi)存由該SMP模塊所分配,則執(zhí)行步驟403,否則執(zhí)行步驟408。
[0167]步驟408、依次查找其它SMP模塊的物理頁(yè)面管理模塊。如果查找到了相應(yīng)的SMP模塊,則執(zhí)行步驟409,否則執(zhí)行步驟410。
[0168]步驟403、返還內(nèi)存給PU空閑塊緩存模塊。具體可以包括將相關(guān)的內(nèi)存塊放入相應(yīng)的執(zhí)行線程所屬的PU空閑塊緩存模塊中。
[0169]步驟404、PU空閑塊緩存模塊執(zhí)行空間壓縮操作。具體可以包括PU空閑塊緩存模塊在接收應(yīng)用程序執(zhí)行線程返還的空閑塊之后,確認(rèn)當(dāng)前PU空閑塊緩存模塊中存放的空閑內(nèi)存塊是否超過一定的閾值上限。如果沒有超過閾值上限,則直接返回;如果超過了閾值上限,就從PU空閑塊緩存模塊中選擇一定數(shù)量的空閑塊返還給空閑塊管理模塊,繼續(xù)執(zhí)行步驟405。這樣做一方面提高了 PU空閑塊的查找效率,另一方面也即時(shí)的將相應(yīng)的內(nèi)存塊返回給上一級(jí)管理模塊,以便其它PU空閑塊緩存模塊能更快的獲得空閑內(nèi)存塊。
[0170]步驟405、空閑塊管理模塊執(zhí)行空間合并操作。具體可以包括空閑塊緩存模塊或者其它SMP模塊的執(zhí)行線程返還一定數(shù)量的空閑塊給空閑塊管理模塊之后,空閑塊管理模塊查找所有空閑塊,并尋找能合并成若干連續(xù)頁(yè)面的內(nèi)存塊。如果找到可合并的內(nèi)存塊,則將這些內(nèi)存塊移除并返還給物理頁(yè)管理器,執(zhí)行步驟406,否則返回。
[0171]步驟406、物理頁(yè)面管理模塊執(zhí)行空間壓縮操作。具體可以包括空閑塊管理模塊返還一定數(shù)量的內(nèi)存頁(yè)給物理頁(yè)面管理模塊之后,物理頁(yè)面管理模塊查找自身所轄的空閑內(nèi)存頁(yè)是否超出一定的閾值上限。如果超出閾值上限,則選擇多個(gè)連續(xù)頁(yè)面返還給DSM內(nèi)存管理器,執(zhí)行步驟407,否則返回。
[0172]步驟407、DSM內(nèi)存管理模塊返還內(nèi)存給操作系統(tǒng)。具體是指物理頁(yè)面管理模塊執(zhí)行空間壓縮操作之后,通過DSM內(nèi)存管理模塊調(diào)用操作系統(tǒng)內(nèi)存釋放接口,將多個(gè)連續(xù)頁(yè)面釋放到系統(tǒng)中。
[0173]步驟409、返還內(nèi)存塊到相應(yīng)SMP模塊的空閑塊管理模塊。具體可以包括執(zhí)行步驟408成功返回之后,將相應(yīng)的內(nèi)存塊返還給對(duì)應(yīng)的SMP模塊的空閑塊管理模塊,并執(zhí)行步驟406,觸發(fā)物理頁(yè)面管理模塊執(zhí)行空間壓縮操作。
[0174]步驟410、通知應(yīng)用程序內(nèi)存釋放異常。具體可以包括執(zhí)行步驟408失敗返回之后,通知應(yīng)用程序所釋放的內(nèi)存不是由內(nèi)存池分配的,該內(nèi)存可能是一個(gè)非法的地址空間,也可能是程序中存在接口的誤調(diào)用,將相關(guān)的異常信息反饋給應(yīng)用程序。
[0175]至此,由應(yīng)用程序執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求和內(nèi)存釋放請(qǐng)求的各種可能情況均得到合理的響應(yīng)。應(yīng)用程序執(zhí)行線程發(fā)起的內(nèi)存分配可以直接做到NUMA感知,同時(shí)由應(yīng)用程序發(fā)起的內(nèi)存分配和內(nèi)存釋放請(qǐng)求的絕大部分操作都將在用戶態(tài)實(shí)現(xiàn),從而減少系統(tǒng)調(diào)用的執(zhí)行次數(shù),提高內(nèi)存管理的性能。
[0176]綜上所述,本發(fā)明實(shí)施例對(duì)面向高性能計(jì)算機(jī)結(jié)點(diǎn)內(nèi)NUMA感知的線程和內(nèi)存資源進(jìn)行了優(yōu)化,具體的:
[0177]針對(duì)操作系統(tǒng)調(diào)度盲目性的問題,本發(fā)明實(shí)施例的高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng)和方法通過與硬件體系結(jié)構(gòu)特征的映射,將相應(yīng)的執(zhí)行線程綁定到相應(yīng)的處理器核,規(guī)避了操作系統(tǒng)調(diào)度的盲目性,去除了不必要的遠(yuǎn)地訪存行為;
[0178]針對(duì)應(yīng)用程序編程模型內(nèi)存分配無(wú)法做到NUMA感知的問題,本發(fā)明實(shí)施例提出的NUMA感知的多線程內(nèi)存管理器及多線程內(nèi)存管理方法通過與DSM體系結(jié)構(gòu)訪存特征的結(jié)合,直接滿足各執(zhí)行線程的本地化內(nèi)存分配請(qǐng)求,顯著提高應(yīng)用程序的訪存局部性;
[0179]針對(duì)First-Touch內(nèi)存分配策略和Auto-Migrat1n自動(dòng)頁(yè)遷移技術(shù)無(wú)法準(zhǔn)確預(yù)知程序的訪存行為的問題,本發(fā)明實(shí)施例提出的NUMA感知的多線程內(nèi)存管理器及多線程內(nèi)存管理方法從應(yīng)用程序內(nèi)部發(fā)起訪存需求,并通過NUMA感知的快速內(nèi)存分配方法和高效內(nèi)存回收方法滿足應(yīng)用程序的本地化訪存需求;
[0180]針對(duì)操作系統(tǒng)對(duì)內(nèi)存管理粒度過大的問題,本發(fā)明實(shí)施例提出的NUMA感知的多線程內(nèi)存管理器及多線程內(nèi)存管理方法通過不同尺寸的內(nèi)存塊,充分滿足應(yīng)用程序的細(xì)粒度訪存需求;
[0181]針對(duì)現(xiàn)有NUMA感知內(nèi)存調(diào)用接口開銷高的問題,本發(fā)明實(shí)施例提出的快速內(nèi)存分配方法和快速內(nèi)存回收方法,將絕大部分的應(yīng)用程序內(nèi)存分配/釋放請(qǐng)求行為在用戶態(tài)進(jìn)行響應(yīng),減少了系統(tǒng)調(diào)用的次數(shù),提高了內(nèi)存管理的性能。
[0182]本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
[0183]本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的系統(tǒng)。
[0184]這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令系統(tǒng)的制造品,該指令系統(tǒng)實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
[0185]這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
[0186]以上所述的具體實(shí)施例,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限定本發(fā)明的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種高性能計(jì)算機(jī)非一致內(nèi)存訪問NUMA感知的線程和內(nèi)存資源優(yōu)化系統(tǒng),其特征在于,包括: 運(yùn)行時(shí)環(huán)境探測(cè)模塊,用于探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況,探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù); 計(jì)算資源分配管理模塊,用于根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系;其中,由每個(gè)并行進(jìn)程開啟的并行區(qū)內(nèi)的執(zhí)行線程在該進(jìn)程所屬的處理器核上調(diào)度,各線程的內(nèi)存資源分配請(qǐng)求在線程所屬進(jìn)程的內(nèi)存資源區(qū)域內(nèi)劃分; 并行編程接口及線程綁定模塊,用于向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上。
2.如權(quán)利要求1所述的系統(tǒng),其特征在于,運(yùn)行時(shí)環(huán)境探測(cè)模塊具體用于: 探測(cè)當(dāng)前計(jì)算結(jié)點(diǎn)包含的對(duì)稱多處理器共享存儲(chǔ)結(jié)構(gòu)SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每塊CPU下掛載的內(nèi)存容量及空閑內(nèi)存信息統(tǒng)計(jì);其中,SMP模塊是由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能; 采用共享內(nèi)存通信計(jì)數(shù)的方式獲知以消息傳遞接口 MPI并行方式運(yùn)行于當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)。
3.一種高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法,其特征在于,包括: 探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況; 探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù); 根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系;其中,由每個(gè)并行進(jìn)程開啟的并行區(qū)內(nèi)的執(zhí)行線程在該進(jìn)程所屬的處理器核上調(diào)度,各線程的內(nèi)存資源分配請(qǐng)求在線程所屬進(jìn)程的內(nèi)存資源區(qū)域內(nèi)劃分; 向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上。
4.如權(quán)利要求3所述的方法,其特征在于,探測(cè)并行程序所在計(jì)算結(jié)點(diǎn)的硬件資源及所述硬件資源的分布情況,包括: 探測(cè)當(dāng)前計(jì)算結(jié)點(diǎn)包含的對(duì)稱多處理器共享存儲(chǔ)結(jié)構(gòu)SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每塊CPU下掛載的內(nèi)存容量及空閑內(nèi)存信息統(tǒng)計(jì);其中,SMP模塊是由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能; 探測(cè)并行程序分布在當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),包括: 采用POSIX共享內(nèi)存寫入的方式統(tǒng)計(jì)當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù),對(duì)運(yùn)行于當(dāng)前計(jì)算結(jié)點(diǎn)上的各個(gè)并行進(jìn)程按如下流程執(zhí)行統(tǒng)計(jì)操作: 初始化進(jìn)程間信號(hào)量; 并行進(jìn)程搶占信號(hào)量鎖資源,若未搶占到則執(zhí)行等待操作; 并行進(jìn)程獲得信號(hào)量鎖資源,嘗試創(chuàng)建共享內(nèi)存; 并行進(jìn)程歸還信號(hào)量鎖資源,讓當(dāng)前計(jì)算結(jié)點(diǎn)上的其它并行進(jìn)程繼續(xù)搶占信號(hào)量鎖資源; 執(zhí)行全局進(jìn)程同步,確保當(dāng)前計(jì)算結(jié)點(diǎn)內(nèi)的并行進(jìn)程已更新完自己的信息; 將共享內(nèi)存中的信息拷貝回當(dāng)前進(jìn)程并排序,將排序后的進(jìn)程號(hào)對(duì)應(yīng)的序號(hào)作為該并行進(jìn)程在計(jì)算結(jié)點(diǎn)內(nèi)的ID號(hào); 回收共享內(nèi)存和信號(hào)量。
5.如權(quán)利要求3所述的方法,其特征在于,根據(jù)所述硬件資源的分布情況及所述并行進(jìn)程數(shù),為各并行進(jìn)程分配處理器和內(nèi)存計(jì)算資源,建立各并行進(jìn)程及并行進(jìn)程的子線程與實(shí)際處理器核和物理內(nèi)存區(qū)域的映射關(guān)系,包括: 按如下方式計(jì)算并行進(jìn)程能夠創(chuàng)建的一級(jí)并行區(qū)和二級(jí)并行區(qū)內(nèi)的線程數(shù)目以及各線程的綁定位置掩碼: 獲取用戶的線程分配約束; 獲取硬件資源信息; 根據(jù)用戶約束確定計(jì)算資源分配方案:如果用戶指定的二級(jí)并行區(qū)線程數(shù)超過每個(gè)SMP模塊實(shí)際擁有的處理器核數(shù)或者用戶指定的二級(jí)并行區(qū)線程數(shù)小于O,則將二級(jí)并行區(qū)線程數(shù)設(shè)定為每個(gè)SMP模塊實(shí)際擁有的處理器核數(shù)目,否則將二級(jí)并行區(qū)數(shù)目設(shè)置為用戶指定的二級(jí)并行區(qū)線程數(shù)目;如果探測(cè)到當(dāng)前計(jì)算結(jié)點(diǎn)上的并行進(jìn)程數(shù)超過當(dāng)前計(jì)算結(jié)點(diǎn)實(shí)際擁有的SMP模塊數(shù)目,則將一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)的線程數(shù)目均置為1,以單線程方式執(zhí)行;如果探測(cè)到的當(dāng)前結(jié)點(diǎn)并行進(jìn)程數(shù)小于SMP模塊數(shù),則按照自然序?qū)MP模塊分配給相應(yīng)的并行進(jìn)程,確定該并行進(jìn)程能夠開啟的一級(jí)并行區(qū)線程數(shù)目和二級(jí)并行區(qū)線程數(shù)目; 計(jì)算各并行進(jìn)程內(nèi)一級(jí)并行線程和二級(jí)并行線程的綁定位置掩碼:如果按照單線程方式執(zhí)行,則將并行進(jìn)程內(nèi)的一級(jí)并行線程和二級(jí)并行線程按照并行進(jìn)程在當(dāng)前計(jì)算結(jié)點(diǎn)內(nèi)的ID號(hào)設(shè)置相應(yīng)的綁定位置掩碼;如果按照多線程方式執(zhí)行,則為并行進(jìn)程內(nèi)的一級(jí)并行線程和二級(jí)并行線程按照自然序的方式設(shè)置綁定位置掩碼; 向并行程序提供相應(yīng)的并行編程接口,在并行程序調(diào)用相應(yīng)的并行編程接口后,根據(jù)所述映射關(guān)系,獲取并行區(qū)內(nèi)各線程的綁定位置掩碼,將執(zhí)行線程綁定到相應(yīng)的CPU核上,包括: 調(diào)用相應(yīng)的并行編程接口,開啟一級(jí)并行區(qū)和二級(jí)并行區(qū); 查詢當(dāng)前執(zhí)行線程的一級(jí)并行區(qū)ID和二級(jí)并行區(qū)ID ; 根據(jù)當(dāng)前執(zhí)行線程的一級(jí)并行區(qū)ID和二級(jí)并行區(qū)ID查詢執(zhí)行線程的綁定位置掩碼; 調(diào)用操作系統(tǒng)提供的線程綁定接口 API,執(zhí)行線程綁定。
6.一種基于權(quán)利要求3至5任一項(xiàng)所述高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法創(chuàng)建的NUMA感知的多線程內(nèi)存管理器,其特征在于,包括: DSM內(nèi)存管理模塊,用于管理MPI進(jìn)程所屬SMP模塊上的內(nèi)存分配及釋放;其中,SMP模塊是由多個(gè)CPU以及掛載在該SMP模塊上的內(nèi)存所組成的計(jì)算資源模塊,在SMP模塊內(nèi)部的處理器核對(duì)該SMP模塊上的內(nèi)存訪問具有相同的訪存性能; SMP模塊內(nèi)存池,用于管理單個(gè)SMP模塊內(nèi)部的內(nèi)存分配及釋放。
7.如權(quán)利要求6所述的多線程內(nèi)存管理器,其特征在于,DSM內(nèi)存管理模塊具體用于:處理由SMP模塊內(nèi)存池發(fā)出的內(nèi)存分配請(qǐng)求,調(diào)用操作系統(tǒng)提供的相關(guān)接口分配物理內(nèi)存頁(yè),或,處理由SMP模塊內(nèi)存池發(fā)出的內(nèi)存釋放請(qǐng)求,調(diào)用操作系統(tǒng)提供的相關(guān)接口回收物理內(nèi)存頁(yè);綁定內(nèi)存頁(yè)地址空間到相應(yīng)的SMP模塊; SMP模塊內(nèi)存池包括: 處理單元空閑塊緩存模塊,用于存儲(chǔ)可供分配給運(yùn)行于當(dāng)前上的執(zhí)行線程的空閑塊;處理運(yùn)行于當(dāng)前PU上的執(zhí)行線程發(fā)出的內(nèi)存申請(qǐng)請(qǐng)求:如果PU空閑塊緩存模塊中有可滿足執(zhí)行線程申請(qǐng)的內(nèi)存塊,則將相應(yīng)內(nèi)存塊分配給相應(yīng)的執(zhí)行線程,否則向空閑塊管理模塊發(fā)出內(nèi)存分配申請(qǐng); 空閑塊管理模塊,用于處理由PU空閑塊緩存模塊發(fā)出的內(nèi)存分配申請(qǐng):查找所維護(hù)的空閑塊管理數(shù)據(jù)結(jié)構(gòu),如果能夠滿足PU空閑塊緩存模塊提出的內(nèi)存分配申請(qǐng),則將相應(yīng)的內(nèi)存塊返回給PU空閑塊緩存模塊并將相應(yīng)的內(nèi)存塊從空閑塊管理數(shù)據(jù)結(jié)構(gòu)中剔除,否則向物理頁(yè)面管理模塊發(fā)出內(nèi)存分配申請(qǐng); 物理頁(yè)面管理模塊,用于管理當(dāng)前SMP模塊上各執(zhí)行線程發(fā)出的內(nèi)存分配及釋放請(qǐng)求;處理空閑塊管理模塊發(fā)出的內(nèi)存分配申請(qǐng)并記錄已分配的內(nèi)存頁(yè)面,并處理各執(zhí)行線程發(fā)出的內(nèi)存分配及釋放請(qǐng)求:查找所管理的連續(xù)空閑內(nèi)存頁(yè),如果能夠滿足空閑塊管理模塊提出的內(nèi)存申請(qǐng)需求,則取出空閑塊管理模塊申請(qǐng)的內(nèi)存頁(yè)面,按照空閑塊管理模塊的要求對(duì)內(nèi)存頁(yè)面進(jìn)行切分并將切分后的內(nèi)存頁(yè)面加入到空閑塊管理模塊,記錄被分配的內(nèi)存頁(yè)面;否則向DSM內(nèi)存管理模塊發(fā)出內(nèi)存分配申請(qǐng)。
8.—種權(quán)利要求7所述多線程內(nèi)存管理器的多線程內(nèi)存管理方法,其特征在于,包括: 根據(jù)權(quán)利要求3至5任一項(xiàng)所述高性能計(jì)算機(jī)NUMA感知的線程和內(nèi)存資源優(yōu)化方法檢測(cè)到的硬件體系結(jié)構(gòu)信息,獲取當(dāng)前DSM結(jié)點(diǎn)上的內(nèi)存資源分布情況:當(dāng)前DSM結(jié)點(diǎn)擁有的SMP模塊數(shù)量,每個(gè)SMP模塊的CPU數(shù)量,每塊CPU的處理器核數(shù)量,每個(gè)SMP模塊上的內(nèi)存容量及已分配情況;使得當(dāng)前計(jì)算結(jié)點(diǎn)上的物理內(nèi)存與實(shí)際所屬的SMP模塊逐一對(duì)應(yīng); 根據(jù)所獲取的內(nèi)存資源分布信息,逐級(jí)創(chuàng)建DSM內(nèi)存管理模塊、物理頁(yè)面管理模塊、空閑塊管理模塊以及PU空閑塊緩存模塊; 對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求進(jìn)行處理;以及,對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存回收請(qǐng)求進(jìn)行處理。
9.如權(quán)利要求8所述的方法,其特征在于,根據(jù)所獲取的內(nèi)存資源分布信息,逐級(jí)創(chuàng)建DSM內(nèi)存管理模塊、物理頁(yè)面管理模塊、空閑塊管理模塊以及I3U空閑塊緩存模塊,包括: 創(chuàng)建DSM內(nèi)存管理模塊:使用操作系統(tǒng)提供的NUMA感知API在指定的SMP模塊分配多個(gè)連續(xù)頁(yè)面大小的物理內(nèi)存,并存儲(chǔ)到DSM內(nèi)存管理模塊中; 創(chuàng)建物理頁(yè)面管理模塊:根據(jù)檢測(cè)到的SMP模塊數(shù)目,為每一個(gè)SMP模塊創(chuàng)建獨(dú)立的物理頁(yè)面管理模塊,記錄由DSM內(nèi)存管理模塊申請(qǐng)的本SMP模塊的物理內(nèi)存頁(yè),并初始化物理內(nèi)存頁(yè)的分配釋放信息; 創(chuàng)建空閑塊管理模塊:根據(jù)檢測(cè)到的SMP模塊數(shù)目,為每一個(gè)SMP模塊創(chuàng)建獨(dú)立的空閑塊管理模塊,將物理頁(yè)面管理模塊中的內(nèi)存按照既定的塊大小進(jìn)行切分,記錄尚未分配給用戶執(zhí)行線程的內(nèi)存塊; 創(chuàng)建PU空閑塊緩存模塊:根據(jù)檢測(cè)到的當(dāng)前SMP模塊包含的處理器核數(shù)目,為每一個(gè)處理器核創(chuàng)建獨(dú)立的PU空閑塊緩存模塊,其中空閑塊緩存模塊是對(duì)于可供分配給當(dāng)前PU執(zhí)行線程的內(nèi)存塊的記錄。
10.如權(quán)利要求8所述的方法,其特征在于,對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存分配請(qǐng)求進(jìn)行處理,包括: 應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存分配請(qǐng)求; 計(jì)算滿足需求的最優(yōu)內(nèi)存塊大小; 根據(jù)最優(yōu)內(nèi)存塊大小以及發(fā)起的申請(qǐng)分配內(nèi)存塊數(shù)量,查找PU空閑塊緩存模塊是否擁有足夠數(shù)量的既定尺寸的內(nèi)存塊,如果查找成功則返回相應(yīng)的內(nèi)存塊給執(zhí)行線程;否則: 根據(jù)PU空閑塊緩存模塊發(fā)起的申請(qǐng)內(nèi)存塊數(shù)量及尺寸,在空閑塊管理模塊中查找是否擁有滿足條件的既定數(shù)量和既定尺寸的內(nèi)存塊,如果查找成功則返回相應(yīng)的內(nèi)存塊給PU空閑塊緩存模塊,并將相應(yīng)的內(nèi)存塊從空閑塊管理數(shù)據(jù)結(jié)構(gòu)中刪除;否則: 空閑塊管理模塊向物理頁(yè)面管理模塊發(fā)出內(nèi)存分配申請(qǐng); 物理頁(yè)面管理模塊接收到空閑塊管理模塊提出的內(nèi)存分配申請(qǐng),檢查自身管理的空閑內(nèi)存頁(yè)是否能夠滿足空閑塊管理模塊提出的內(nèi)存申請(qǐng)需求,若是則取出空閑塊管理模塊申請(qǐng)的內(nèi)存頁(yè)面,按照空閑塊管理模塊的要求對(duì)內(nèi)存頁(yè)面進(jìn)行切分并將切分后的內(nèi)存頁(yè)面加入到空閑塊管理模塊,記錄被分配的內(nèi)存頁(yè)面;否則: 物理頁(yè)面管理模塊向DSM內(nèi)存管理模塊發(fā)出內(nèi)存分配申請(qǐng); DSM內(nèi)存管理模塊則通過操作系統(tǒng)提供的內(nèi)存分配接口,確定在指定的SMP模塊是否能夠分配相應(yīng)長(zhǎng)度的內(nèi)存,如是則將相應(yīng)內(nèi)存地址空間綁定到相應(yīng)的SMP模塊,同時(shí)將物理內(nèi)存頁(yè)返回給物理頁(yè)面管理模塊,否則報(bào)錯(cuò)退出; 對(duì)用戶執(zhí)行線程發(fā)起的內(nèi)存回收請(qǐng)求進(jìn)行處理,包括: 應(yīng)用程序執(zhí)行線程發(fā)起內(nèi)存釋放請(qǐng)求; 查找分配相關(guān)內(nèi)存塊的物理頁(yè)面管理模塊;如果相關(guān)內(nèi)存由該SMP模塊所分配,則:將相關(guān)的內(nèi)存塊放入相應(yīng)的執(zhí)行線程所屬的PU空閑塊緩存模塊中空閑塊緩存模塊執(zhí)行空間壓縮操作;空閑塊管理模塊執(zhí)行空間合并操作;物理頁(yè)面管理模塊執(zhí)行空間壓縮操作;DSM內(nèi)存管理模塊返還內(nèi)存給操作系統(tǒng);否則: 依次查找其它SMP模塊的物理頁(yè)面管理模塊,如果查找到相應(yīng)的SMP模塊,則返還內(nèi)存塊到相應(yīng)SMP模塊的空閑塊管理模塊;否則通知應(yīng)用程序內(nèi)存釋放異常。
【文檔編號(hào)】G06F9/50GK104375899SQ201410677736
【公開日】2015年2月25日 申請(qǐng)日期:2014年11月21日 優(yōu)先權(quán)日:2014年11月21日
【發(fā)明者】莫?jiǎng)t堯, 張愛清, 楊章, 田鴻運(yùn) 申請(qǐng)人:北京應(yīng)用物理與計(jì)算數(shù)學(xué)研究所