專利名稱:并行計(jì)算的內(nèi)存訪問(wèn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù),特別是涉及多線程的PDF格式文件操作中的內(nèi)存訪問(wèn)控制;以及由此引申出來(lái)的多線程并行計(jì)算時(shí)的內(nèi)存訪問(wèn)策略和提高運(yùn)行效率的方法。
背景技術(shù):
圖書(shū)、圖片、文件等實(shí)體資源的數(shù)字化通常是采用掃描——識(shí)別——提取的方式。 先將文檔掃描為PDF格式,再進(jìn)行文檔模塊和文字的識(shí)別,之后提取識(shí)別后的信息,供編檔 和供給搜索引擎以供建立索引?,F(xiàn)有技術(shù)中,對(duì)大量的PDF格式的文檔進(jìn)行操作時(shí),往往需 要大量的系統(tǒng)資源,包括CPU和內(nèi)存資源,并且對(duì)PDF格式文檔的處理速度也較慢。為了提 高處理速度,各種方式被選用,特別是近年來(lái)隨著多核處理器技術(shù)的成熟,在多個(gè)CPU上同 時(shí)運(yùn)行多個(gè)線程成為提高計(jì)算速度的首選方式之一。然而,實(shí)際操作中,卻往往出現(xiàn)速度提高有限,而同時(shí)CPU卻不能被完全利用的情 況。例如,如果充分利用CPU,那么在多核機(jī)器上,例如4核CPU上測(cè)試,開(kāi)4個(gè)線程,做壓力 測(cè)試的時(shí)候,每個(gè)線程占用一個(gè)CPU,理論上CPU占用率應(yīng)該是接近100%的。但是在實(shí)際 的測(cè)試中發(fā)現(xiàn),CPU占用率遠(yuǎn)低于100%,甚至很多時(shí)候,CPU占用率只達(dá)到25%。這說(shuō)明, 并非每個(gè)CPU都在工作,這里應(yīng)該是有線程等待。CPU并沒(méi)有得到充分的利用。本案發(fā)明人結(jié)合自身多年業(yè)內(nèi)工作經(jīng)驗(yàn)和實(shí)驗(yàn)結(jié)果對(duì)此現(xiàn)象的成因進(jìn)行了分析 和研究,并最終得出該情況的發(fā)生主要在于對(duì)內(nèi)存操作工程中,無(wú)論是內(nèi)存的分配和釋放 都需要線程保護(hù),且所有的線程共享一個(gè)內(nèi)存池,從而導(dǎo)致了訪問(wèn)等待,使CPU無(wú)法被充分 利用。而PDF操作對(duì)內(nèi)存是非常頻繁的操作,所以引起了大量的線程等待。關(guān)于內(nèi)存訪問(wèn),在傳統(tǒng)操作系統(tǒng)的內(nèi)存管理中,多是將每個(gè)應(yīng)用程序加載到一個(gè) 單獨(dú)的進(jìn)程,并為每一進(jìn)程指定私有的內(nèi)存空間,內(nèi)存空間在進(jìn)程間不能互訪。一般來(lái)說(shuō), 一個(gè)應(yīng)用程序進(jìn)程運(yùn)行時(shí)會(huì)創(chuàng)建多個(gè)實(shí)體,即線程,同屬一個(gè)進(jìn)程的多個(gè)線程共享該進(jìn)程 的資源。隨著計(jì)算技術(shù)和硬件的發(fā)展,特別是近年來(lái)多核處理器的廣泛應(yīng)用,線程的并發(fā) 執(zhí)行(并行計(jì)算)越來(lái)越普遍。在多個(gè)線程并行時(shí),考慮到數(shù)據(jù)安全,其對(duì)共享內(nèi)存的訪問(wèn) 往往是逐一進(jìn)行而不能同時(shí)訪問(wèn),即便允許同時(shí)訪問(wèn)也經(jīng)常會(huì)有分配的內(nèi)存池容量不夠多 個(gè)線程之用的情況,這就造成了內(nèi)存訪問(wèn)的等待。特別是在使用多CPU,每個(gè)CPU運(yùn)行一個(gè) 線程的情況,當(dāng)CPU處理所需時(shí)間小于內(nèi)存訪問(wèn)和等待時(shí)間時(shí),內(nèi)存訪問(wèn)就成了計(jì)算速度 的瓶頸,使得CPU資源無(wú)法得到充分的利用,妨礙了計(jì)算速度的進(jìn)一步提高。為了改善內(nèi)存訪問(wèn),本領(lǐng)域技術(shù)人員提出了多種方法。例如,專利授權(quán)公告號(hào) CN100487660C,名為“一種多線程處理器動(dòng)態(tài)內(nèi)存管理系統(tǒng)及方法”的中國(guó)發(fā)明專利公開(kāi)了 一種多線程處理器動(dòng)態(tài)內(nèi)存管理方法,參見(jiàn)圖1,該方法包括以下步驟主控內(nèi)核線程從系 統(tǒng)內(nèi)存中申請(qǐng)一段內(nèi)存作為內(nèi)存池(步驟101);所有內(nèi)核線程向所述主控內(nèi)核線程發(fā)送申 請(qǐng)內(nèi)存消息,主控內(nèi)核線程收到所述申請(qǐng)內(nèi)存消息后,從所述內(nèi)存池中分配空閑的內(nèi)存給 申請(qǐng)內(nèi)存的內(nèi)核線程,并向申請(qǐng)內(nèi)存的內(nèi)核線程發(fā)送分配內(nèi)存消息(步驟102);所述主控內(nèi)核線程查詢內(nèi)核線程已申請(qǐng)的內(nèi)存的使用情況,定期發(fā)送回收內(nèi)存消息(步驟103);內(nèi) 核線程收到所述回收內(nèi)存消息后,對(duì)內(nèi)存進(jìn)行歸還,并向主控內(nèi)核線程發(fā)送釋放內(nèi)存消息 (步驟104)。該方法在一定程度上解決了內(nèi)核線程的內(nèi)存釋放問(wèn)題,能夠避免某一時(shí)刻某一空 閑的內(nèi)核線程占用過(guò)多的空閑內(nèi)存。由主控內(nèi)核線程取代硬件仲裁器,利用消息機(jī)制,提高 了內(nèi)存在各個(gè)內(nèi)核線程間的分配使用效率。但是該方法卻無(wú)法解決共享一個(gè)內(nèi)存池的多個(gè) 線程均請(qǐng)求較大內(nèi)存空間而必須排隊(duì)等候的問(wèn)題。并且應(yīng)用此方法,要改變內(nèi)存管理代碼, 并不適合代碼的直接移植。
發(fā)明內(nèi)容
本發(fā)明的目的在于,針對(duì)多個(gè)線程調(diào)用同一個(gè)執(zhí)行模塊時(shí),由于必須共享同一內(nèi) 存池,且該內(nèi)存池?zé)o法提供足夠資源而導(dǎo)致內(nèi)存訪問(wèn)等待時(shí)間過(guò)長(zhǎng)的問(wèn)題,提供一種新的 內(nèi)存訪問(wèn)策略,以縮短甚或消除并行計(jì)算時(shí)的內(nèi)存訪問(wèn)等待時(shí)間,使單個(gè)線程能夠擁有獨(dú) 立的內(nèi)存池。更重要的目的是,要能在不改變或很少改變模塊代碼特別是完全不改變內(nèi)存管理 的情況下,將單線程代碼,簡(jiǎn)單移植到多線程環(huán)境中。并讓多核多線程的優(yōu)勢(shì)得到充分發(fā) 揮。本發(fā)明的并行計(jì)算的內(nèi)存訪問(wèn)方法,用于存在調(diào)用同一原始執(zhí)行模塊的n > 2個(gè) 并行線程的情況,其特征在于,包括以下步驟S 1)根據(jù)線程數(shù)n確定需創(chuàng)建的映像執(zhí)行模塊的個(gè)數(shù)k,n-1彡k彡1 ;S2)確定該n個(gè)線程與原始執(zhí)行模塊及k個(gè)映像執(zhí)行模塊之間的映射策略F ;S3)創(chuàng)建k個(gè)映像執(zhí)行模塊,并為其分配各自私有的內(nèi)存池;S4)執(zhí)行所述并行的n個(gè)線程,令各個(gè)線程按照所述映射策略F調(diào)用執(zhí)行模塊,每 個(gè)執(zhí)行模塊訪問(wèn)且僅訪問(wèn)其私有的內(nèi)存池;S5)線程運(yùn)行完成后刪除創(chuàng)建的映像執(zhí)行模塊,釋放資源。其中,所述映像執(zhí)行模塊的個(gè)數(shù)為k可以是隨時(shí)間變化的。或者,所述映像執(zhí)行模 塊的個(gè)數(shù)k在線程執(zhí)行期間也可是固定不變的。較佳地,可根據(jù)同一時(shí)間調(diào)用同一執(zhí)行模塊的線程個(gè)數(shù)的統(tǒng)計(jì)值來(lái)確定映像執(zhí)行 模塊的數(shù)量。根據(jù)本發(fā)明的一實(shí)施例,所述映像執(zhí)行模塊的個(gè)數(shù)k為1個(gè)。根據(jù)本發(fā)明的另一實(shí)施例,所述映像執(zhí)行模塊的個(gè)數(shù)k為n-1個(gè)。其中,當(dāng)所述映像執(zhí)行模塊的個(gè)數(shù)k為n-1個(gè)時(shí),所述映射策略F可為每個(gè)線程 分別調(diào)用一個(gè)不同的執(zhí)行模塊,線程與執(zhí)行模塊是一一對(duì)應(yīng)的。根據(jù)本發(fā)明的再一實(shí)施例,所述映射策略F可為靜態(tài)策略,一個(gè)線程僅指向一個(gè) 被它調(diào)用的執(zhí)行模塊,而一個(gè)執(zhí)行模塊被一個(gè)或一個(gè)以上的線程調(diào)用。較佳地,所述映射策略F為將調(diào)用執(zhí)行模塊頻繁的線程,配置為獨(dú)享一個(gè)執(zhí)行模 塊,將相對(duì)調(diào)用執(zhí)行模塊頻率較低的線程,配置為共享執(zhí)行模塊。根據(jù)本發(fā)明的又一實(shí)施例,所述映射策略F為動(dòng)態(tài)策略的“多窗口排隊(duì)”機(jī)制,該 策略F中,為每個(gè)執(zhí)行模塊定義“空閑”、“繁忙”兩個(gè)狀態(tài),將所有的空閑執(zhí)行模塊排隊(duì),需
4要調(diào)用執(zhí)行模塊的線程從空閑執(zhí)行模塊隊(duì)列中擇一調(diào)用,若沒(méi)有空閑的則等待;在線程對(duì)執(zhí)行模塊的調(diào)用進(jìn)行中將該執(zhí)行模塊標(biāo)記為繁忙,執(zhí)行完畢后,線程釋放該執(zhí)行模塊,將其 標(biāo)記為空閑。應(yīng)用本發(fā)明的方法可令并行計(jì)算的效率隨核心數(shù)增加而呈線性增長(zhǎng),而不受內(nèi)存 訪問(wèn)瓶頸的限制。對(duì)各種操作系統(tǒng)均可適用。并且,使用靜態(tài)方式時(shí),甚至無(wú)需增加代碼, 即可將單線程的程序直接移植到多線程環(huán)境。而靈活的動(dòng)態(tài)方式和動(dòng)態(tài)映射策略,則可使 本發(fā)明在占用不是那么多的系統(tǒng)資源的情況下顯著提高效率,事半功倍。
圖1是現(xiàn)有技術(shù)的一種內(nèi)存管理方法的流程圖;圖2是多個(gè)線程均調(diào)用同一執(zhí)行模塊時(shí)的內(nèi)存訪問(wèn)示意圖;圖3是為多個(gè)線程分別創(chuàng)建各自的執(zhí)行模塊時(shí)的內(nèi)存訪問(wèn)示意圖;圖4是本發(fā)明的內(nèi)存訪問(wèn)方法優(yōu)選實(shí)施例的流程示意圖;圖5是使用本發(fā)明的方法與使用其它措施時(shí)的線程性能比較示意圖一;圖6是使用本發(fā)明的方法與使用其它措施時(shí)的線程性能比較示意圖二 ;圖7是使用本發(fā)明的方法與使用其它措施時(shí)的線程性能比較示意圖三。
具體實(shí)施例方式本發(fā)明目的在于在不改變操作系統(tǒng)的內(nèi)存管理的前提下改變內(nèi)存訪問(wèn)方式。為對(duì) 便于對(duì)本發(fā)明進(jìn)行更好的理解,首先對(duì)一般的內(nèi)存管理方式進(jìn)行說(shuō)明。內(nèi)存管理的特點(diǎn)之一是執(zhí)行模塊是隔離的,每一個(gè)執(zhí)行模塊被分配獨(dú)立的內(nèi)存池 空間。其中,執(zhí)行模塊可視為是系統(tǒng)在內(nèi)存中建立的一個(gè)個(gè)數(shù)據(jù)結(jié)構(gòu),用于管理運(yùn)行時(shí)加載 到內(nèi)存中的程序代碼,數(shù)據(jù)以及資源。每個(gè)執(zhí)行模塊作為一個(gè)系統(tǒng)資源的分配單位,享有其 獨(dú)自的內(nèi)存池,執(zhí)行模塊中的多個(gè)函數(shù)將共享該執(zhí)行模塊的內(nèi)存池。所述執(zhí)行模塊可以是運(yùn)行后被加載到進(jìn)程中的一個(gè)windows下的.exe程序或一 個(gè)動(dòng)態(tài)鏈接庫(kù)(dll)等。同一個(gè)執(zhí)行模塊,不論多少個(gè)線程在調(diào)用,只會(huì)被加載一次,由同 一個(gè)進(jìn)程開(kāi)啟的所有線程,對(duì)于同一執(zhí)行模塊,它的內(nèi)存池是共享的。依操作系統(tǒng)類型的不 同,執(zhí)行模塊還可有其它形式。按照本領(lǐng)域技術(shù)人員的公知,不同的操作系統(tǒng)的內(nèi)存管理模 式會(huì)有區(qū)別,但是均會(huì)存在這樣一種特定的單元,其由一些數(shù)據(jù)和代碼的集合構(gòu)成,表現(xiàn)為 程序、函數(shù)等形式,并且對(duì)該種代碼組合操作系統(tǒng)會(huì)分配私有的(private)內(nèi)存空間(包括 邏輯的或物理的)以供其訪問(wèn)。因此,在本發(fā)明中,執(zhí)行模塊也可理解為在給定操作系統(tǒng) 下,依據(jù)該操作系統(tǒng)的默認(rèn)內(nèi)存管理方式而為其分配單獨(dú)的內(nèi)存池的一組代碼和數(shù)據(jù)的集
口 o圖2示出了多個(gè)線程用到了同一個(gè)執(zhí)行模塊情況下的內(nèi)存訪問(wèn)情況。其中進(jìn)程 1(211),進(jìn)程2 (212)……進(jìn)程n (213)等為某一應(yīng)用程序的多個(gè)并行線程,它們均需要調(diào)用 一執(zhí)行模塊220,執(zhí)行模塊220訪問(wèn)內(nèi)存池230。在此類多線程環(huán)境下,當(dāng)多個(gè)線程(211到213)同時(shí)調(diào)用一個(gè)執(zhí)行模塊(220)的 時(shí)候,如果在執(zhí)行模塊中多個(gè)線程同時(shí)需要對(duì)內(nèi)存進(jìn)行操作(例如申請(qǐng)和釋放),即同時(shí)對(duì) 同一個(gè)內(nèi)存池操作,則線程對(duì)內(nèi)存的訪問(wèn)需要排隊(duì),從而由內(nèi)存引起了線程的等待,導(dǎo)致無(wú)法充分利用CPU資源。這也正是本發(fā)明意欲解決的問(wèn)題所在。圖3顯示了本發(fā)明為解決上述問(wèn)題而為每個(gè)線程分別創(chuàng)建各自的執(zhí)行模塊時(shí)的內(nèi)存訪問(wèn)示意圖。以n個(gè)線程為例(n為自然數(shù)),默認(rèn)情況下(參見(jiàn)圖2),系統(tǒng)只有一個(gè) 原始執(zhí)行模塊1 (321),而在本發(fā)明中,根據(jù)進(jìn)程數(shù)量,額外創(chuàng)建了 n-1個(gè)映像執(zhí)行模塊,即 執(zhí)行模塊2(322)到執(zhí)行模塊n (323),從而使執(zhí)行模塊的總數(shù)量與線程總數(shù)相等。其中,映 像執(zhí)行模塊可以由原始執(zhí)行模塊1復(fù)制而得,功能與原執(zhí)行模塊相同。此時(shí),對(duì)于操作系統(tǒng) 而言,由于其默認(rèn)地會(huì)為每個(gè)執(zhí)行模塊分配單獨(dú)的內(nèi)存池,因此各個(gè)執(zhí)行模塊分別訪問(wèn)各 自不同的內(nèi)存池,互不干擾。例如圖3所示的執(zhí)行模塊1(321)訪問(wèn)內(nèi)存池1(331),執(zhí)行模 塊2 (322)訪問(wèn)內(nèi)存池2 (332),……,執(zhí)行模塊n (323)訪問(wèn)內(nèi)存池3 (333)。從而在不改變 操作系統(tǒng)和內(nèi)存管理代碼的前提下,實(shí)現(xiàn)了使每個(gè)線程擁有單獨(dú)的內(nèi)存池。這樣,在需要內(nèi) 存操作的時(shí)候,各個(gè)線程不需要搶占同一個(gè)內(nèi)存池,也就無(wú)需等待。簡(jiǎn)而言之,本發(fā)明通過(guò)復(fù)制執(zhí)行模塊的方法實(shí)現(xiàn)多線程下每個(gè)線程使用獨(dú)立的內(nèi) 存池管理。使共享資源變成了獨(dú)享資源,以空間換取時(shí)間,避免了由線程間內(nèi)存訪問(wèn)沖突帶 來(lái)的等待。本實(shí)施例以空間換時(shí)間的最典型例子。該解決方法在不改變或很少改變模塊代 碼,特別是能在完全不改變內(nèi)存管理的情況下,將單線程代碼簡(jiǎn)單的移植到多線程環(huán)境中, 可以說(shuō)是解決并行計(jì)算效率問(wèn)題的萬(wàn)能方法。要強(qiáng)調(diào)的是,對(duì)n個(gè)線程而言,創(chuàng)建的映像執(zhí)行模塊的數(shù)量不一定要是n-1個(gè),其 可以是從1到n-1之間的任意數(shù)量。因?yàn)?,從上面的分析可以明確,映像執(zhí)行模塊的目的在 于緩解內(nèi)存訪問(wèn)的排隊(duì)現(xiàn)象。這就好比在服務(wù)窗口排隊(duì)的情形,當(dāng)n個(gè)顧客只能通過(guò)一個(gè) 窗口獲得服務(wù)時(shí)時(shí),效率低,等待時(shí)間的數(shù)學(xué)期望長(zhǎng);而再增加一個(gè)窗口(k=l)即可使整 個(gè)排隊(duì)等待時(shí)間的顯著降低;創(chuàng)建n-1個(gè)映像執(zhí)行模塊則可使期望排隊(duì)時(shí)間降為0??梢?jiàn) 圖3所示的實(shí)施例是以減小線程內(nèi)存訪問(wèn)的排隊(duì)等待時(shí)間為目的時(shí)的一個(gè)優(yōu)選實(shí)施例,而 不能作為對(duì)本發(fā)明實(shí)施方式的限制。下面結(jié)合具體的圖4的具體流程,對(duì)本發(fā)明的方法進(jìn)行進(jìn)一步的說(shuō)明。總體上說(shuō), 本發(fā)明的映像執(zhí)行模塊的創(chuàng)建可以分為動(dòng)態(tài)方式和靜態(tài)方式兩類。其中,靜態(tài)方式是指線 程與各個(gè)執(zhí)行模塊之間的對(duì)應(yīng)拓?fù)溆成洳呗栽谡麄€(gè)程序執(zhí)行過(guò)程中該線程的生命周期內(nèi) 是固定不變的;而動(dòng)態(tài)方式中,映像執(zhí)行模塊的數(shù)量提及線程與各個(gè)執(zhí)行模塊之間的映射 策略可以改變。圖4是本發(fā)明的內(nèi)存訪問(wèn)方法優(yōu)選實(shí)施例的流程示意圖。其中,從開(kāi)始到結(jié)束的 過(guò)程可以是代表一個(gè)應(yīng)用程序的始末;也可以是表示一組需調(diào)用同一原始執(zhí)行模塊的線程 的生命周期等執(zhí)行過(guò)程。其可依本發(fā)明的應(yīng)用場(chǎng)合而定,本領(lǐng)域技術(shù)人員可自行根據(jù)不同 的應(yīng)用做出選擇,并不構(gòu)成對(duì)本發(fā)明的限制。為敘述方便,下文中以te
來(lái)表示從開(kāi) 始到結(jié)束過(guò)程中的任意時(shí)間點(diǎn),t = 0為開(kāi)始,t = T為結(jié)束。作為統(tǒng)稱,執(zhí)行模塊包括原始 執(zhí)行模塊和映像執(zhí)行模塊。其中,所述映像執(zhí)行模塊與原始執(zhí)行模塊執(zhí)行相同的功能,但被 分配使用不同的系統(tǒng)資源(例如CPU和內(nèi)存空間)。首先,在步驟410獲取需調(diào)用同一原始執(zhí)行模塊的并行的線程的數(shù)量n,n為自然 數(shù)。然后,在步驟420,對(duì)n進(jìn)行判斷,在n= 1時(shí),只有一個(gè)線程,該線程與執(zhí)行模塊是唯一 對(duì)應(yīng)的,不會(huì)發(fā)生由排隊(duì)導(dǎo)致的內(nèi)存訪問(wèn)等待,轉(zhuǎn)到步驟460直接執(zhí)行該線程即可。當(dāng)2時(shí),代表可能會(huì)發(fā)生等待,需要?jiǎng)?chuàng)建映像執(zhí)行模塊來(lái)改善內(nèi)存訪問(wèn)。一般來(lái)說(shuō),線程的數(shù)量 n的設(shè)置與計(jì)算設(shè)備CPU的核心數(shù)有關(guān)。接下來(lái),執(zhí)行步驟430,確定需新創(chuàng)建的映像執(zhí)行模塊數(shù)k,k為自然數(shù)且優(yōu)選地,
其中,創(chuàng)建n-1個(gè)映像執(zhí)行模塊的情況參見(jiàn)圖3所示,此時(shí)相當(dāng)于以最大的空 間來(lái)?yè)Q取最高的時(shí)間效率。而在其它數(shù)值之間選擇,則是空間和時(shí)間二者折衷的結(jié)果。本 領(lǐng)域技術(shù)人員可以在本發(fā)明的教導(dǎo)下根據(jù)實(shí)際的應(yīng)用環(huán)境進(jìn)行選擇。例如,當(dāng)并行的線程 數(shù)量太多,而總的內(nèi)存空間有限,如果創(chuàng)建過(guò)多的映像執(zhí)行模塊將影響其它程序的運(yùn)行或 顯著降低系統(tǒng)的整體效能,甚至是內(nèi)存空間根本不夠建立那么多的映像執(zhí)行模塊時(shí),都需 要減少映像執(zhí)行模塊的數(shù)量。再比如,可根據(jù)線程同時(shí)調(diào)用同一執(zhí)行模塊的概率來(lái)確定映 像執(zhí)行模塊的數(shù)量,所述概率大時(shí)創(chuàng)建較多的映像執(zhí)行模塊;以及根據(jù)同一時(shí)間調(diào)用同一 執(zhí)行模塊的線程個(gè)數(shù)的統(tǒng)計(jì)值(例如最大值、中值或數(shù)學(xué)期望)來(lái)確定執(zhí)行模塊的數(shù)量。選擇靜態(tài)方式一種簡(jiǎn)捷的實(shí)施方式。其中,k為固定值,k(t)在t e
是保 持不變的。靜態(tài)方式的好處在于,程序執(zhí)行簡(jiǎn)單,占用內(nèi)存空間固定,利于穩(wěn)定執(zhí)行。不足 之處是當(dāng)進(jìn)程執(zhí)行過(guò)程中對(duì)執(zhí)行模塊的調(diào)動(dòng)頻率波動(dòng)較大時(shí),如果選擇大的k值可能會(huì)造 成內(nèi)存空間的浪費(fèi),而選擇較小的k值又可能會(huì)導(dǎo)致在調(diào)用頻繁的時(shí)段發(fā)生內(nèi)存訪問(wèn)的等待。動(dòng)態(tài)方式則較為靈活。k(t)在t G
是可變的,根據(jù)進(jìn)程執(zhí)行過(guò)程中對(duì)執(zhí)行 模塊的調(diào)動(dòng)頻率,k(t)可以設(shè)為分段函數(shù)。在多個(gè)線程對(duì)執(zhí)行模塊頻繁的時(shí)段,選擇較大 的k(t)值,而在相對(duì)來(lái)說(shuō)調(diào)用執(zhí)行模塊較少的時(shí)段,則選擇較小的k(t)值。在進(jìn)程的執(zhí)行 過(guò)程中靈活改變,從而及時(shí)釋放資源,避免造成內(nèi)存空間的浪費(fèi)。但是動(dòng)態(tài)方式的不足之處 在于訪問(wèn)控制稍嫌復(fù)雜,并且會(huì)存在參數(shù)傳遞等問(wèn)題,需要另外增加代碼,不利于單線程程 序向多線程程序的直接移植。在步驟440,確定該n個(gè)線程與原始執(zhí)行模塊及k個(gè)映像執(zhí)行模塊之間的映射策略F.所述映射策略F主要體現(xiàn)的是哪一個(gè)線程調(diào)用哪一個(gè)執(zhí)行模塊這樣的單向關(guān)系。 同樣,映射策略F也分為靜態(tài)策略和動(dòng)態(tài)策略。其中,對(duì)于靜態(tài)策略,一個(gè)線程僅指向一個(gè) 被它調(diào)用的執(zhí)行模塊,而一個(gè)執(zhí)行模塊可被一個(gè)或一個(gè)以上的線程調(diào)用。且這種調(diào)用關(guān)系 在t e
時(shí)間段內(nèi)保持不變。靜態(tài)策略執(zhí)行簡(jiǎn)單,無(wú)需過(guò)多的額外代碼。進(jìn)一步較佳的是,對(duì)于那些調(diào)用執(zhí)行模塊頻繁的線程,可以配置為獨(dú)享一個(gè)執(zhí)行 模塊,而對(duì)相對(duì)調(diào)用執(zhí)行模塊較少的線程,配置為共享執(zhí)行模塊。而對(duì)于動(dòng)態(tài)策略,線程可以并不固定指向某一個(gè)執(zhí)行模塊。例如可以配合映像執(zhí) 行模塊的動(dòng)態(tài)方式而將映射策略F也做分段設(shè)置,將時(shí)間t e
分成幾個(gè)時(shí)間段,在每 個(gè)時(shí)間段中使用靜態(tài)策略。或者還可以采取一種類似“多窗口排隊(duì)”的機(jī)制等多種不同的 方式。根據(jù)本發(fā)明的一實(shí)施例,為每個(gè)執(zhí)行模塊定義“空閑”和“繁忙”兩個(gè)狀態(tài)分別對(duì) 應(yīng)不同的調(diào)用狀態(tài)。將所有的空閑執(zhí)行模塊排隊(duì),第一個(gè)需要調(diào)用執(zhí)行模塊的線程調(diào)用空 閑執(zhí)行模塊隊(duì)列的第一個(gè);每當(dāng)有新的線程要調(diào)用執(zhí)行模塊時(shí),令其調(diào)用空閑執(zhí)行模塊隊(duì) 列中的下一個(gè),若沒(méi)有空閑。在線程對(duì)執(zhí)行模塊的調(diào)用進(jìn)行中將該執(zhí)行模塊標(biāo)記為繁忙,執(zhí) 行完畢后,線程釋放該執(zhí)行模塊,將其標(biāo)記為空閑。這種排隊(duì)機(jī)制的好處是可以最大限度的充分利用資源,特別是對(duì)k<n_l的情況,既能從總體上節(jié)約內(nèi)存資源,又能有效避免有資 源閑置情況下卻發(fā)生內(nèi)存訪問(wèn)等待的情況。特別適用于線程較多,而且線程對(duì)執(zhí)行模塊的 調(diào)用隨機(jī)性較強(qiáng)的情況,用本實(shí)施例的方法可以用較少的內(nèi)存映像模塊來(lái)實(shí)現(xiàn)效率的大幅提尚。顯然,各種映像模塊的靜態(tài)方式和動(dòng)態(tài)方式與映射策略F的靜態(tài)策略和動(dòng)態(tài)策略 可以相互組合而構(gòu)成各種靈活的內(nèi)存訪問(wèn)控制策略。其具體實(shí)施的步驟,在上述本發(fā)明內(nèi) 容的教導(dǎo)下,本領(lǐng)域技術(shù)人員當(dāng)可自行實(shí)現(xiàn)。要注意的是,無(wú)論怎樣的組合和變換,只要未 脫離本發(fā)明的精神實(shí)質(zhì),均將落入所附權(quán)利要求書(shū)所限定的范圍。之后進(jìn)行步驟450,創(chuàng)建k個(gè)映像執(zhí)行模塊,并為其分配各自獨(dú)立的內(nèi)存池。這一 步中,映像執(zhí)行模塊創(chuàng)建之后,內(nèi)存分配實(shí)際上是由操作系統(tǒng)控制完成的,并不需要應(yīng)用程 序的干預(yù)。在映像執(zhí)行模塊完成之后,接著進(jìn)行步驟460,執(zhí)行所述并行的n個(gè)線程,并令其 按照所述調(diào)用映射策略F調(diào)用執(zhí)行模塊。在執(zhí)行過(guò)程中,每個(gè)執(zhí)行模塊訪問(wèn)且僅訪問(wèn)其私 有的內(nèi)存池。最后是步驟470,線程運(yùn)行完成后刪除所有創(chuàng)建的映像執(zhí)行模塊,釋放為映像執(zhí)行 模塊分配的資源。圖5到圖7顯示了依據(jù)本發(fā)明的方法進(jìn)行內(nèi)存訪問(wèn)控制后的性能與不使用本發(fā)明 時(shí)的比較,通過(guò)以下示例體現(xiàn)。要說(shuō)明的是,以下示例僅是為了說(shuō)明本發(fā)明的效果,而非對(duì) 本發(fā)明的實(shí)施條件進(jìn)行限制。以windows操作系統(tǒng)為例,通過(guò)對(duì)pdf文件進(jìn)行簡(jiǎn)單文字提取來(lái)進(jìn)行測(cè)試。測(cè) 試環(huán)境軟件環(huán)境 Windows XP professional SP2 32bit,硬件環(huán)境 Core 2 QuadQ6600 2. 4GHz (4core) 3. 25GB 內(nèi)存。測(cè)試工具使用微軟公司發(fā)布的platform sdk中的ifilttst. exe測(cè)試工具程序 ifilttst. exe,該程序僅僅對(duì)文件進(jìn)行一次完整提取,并不進(jìn)行更多的檢查性工作。關(guān)于 該測(cè)試工具為本領(lǐng)域公知常用的一種,關(guān)于其詳細(xì)資料,可參考httP://mSdn. microsoft. com/en-us/1 ibrary/ms692580 (28VS. 85). aspx 上的說(shuō)明。ifilttst. exe可對(duì)應(yīng)創(chuàng)建不同數(shù)量的線程,在運(yùn)行中,各個(gè)線程會(huì)調(diào)用一執(zhí)行模 塊example, dll。在圖5到圖7中的橫坐標(biāo)1,2,3,4表示線程數(shù),對(duì)應(yīng)的使用多個(gè)不同的 處理器核心運(yùn)行。縱坐標(biāo)用文件處理速度表示的性能指數(shù)。不同的曲線分別表示針對(duì)使用 本發(fā)明的方法和不使用時(shí)的執(zhí)行情況。其中,本發(fā)明的方法的實(shí)施方式為對(duì)不同的線程數(shù) n,分別創(chuàng)建k = n-1個(gè)映射執(zhí)行模塊,且采用靜態(tài)方式下的靜態(tài)映射策略。即每個(gè)線程指 向一個(gè)執(zhí)行模塊,且在整個(gè)執(zhí)行過(guò)程中保持不變。圖5的實(shí)施例中,樣本1為219個(gè)文件,總大小1. 54GB,特點(diǎn)文件較大,文件個(gè)數(shù) 較少。圖6的實(shí)施例中,樣本2為351個(gè)文件,總大小1. 16GB,文件數(shù)目和每個(gè)文件的大 小較為平均。圖7中的樣本3為1274個(gè)文件,總大小925MB,文件數(shù)目多而且體積較小。在圖5-7中,曲線L1為ifilttst. exe使用本發(fā)明方法時(shí)的執(zhí)行情況;曲線L2為 ifilttst. exe未使用本發(fā)明加速方法前的運(yùn)行情況。
從圖5到圖7可以看到,測(cè)試工具程序ifilttst. exe的單線程性能雖然沒(méi)有提 高,但是多線程的性能正真得到了釋放,每個(gè)核心都被利用了起來(lái),1到4線程時(shí),性能呈線 性增長(zhǎng)。而未采用本發(fā)明加速方法的曲線L2,雖然隨著CPU核心的增加性能也有所改進(jìn),卻 無(wú)法將CPU性能發(fā)揮到最佳,性能始終受到限制。以上對(duì)本發(fā)明的描述是說(shuō)明性的,而非限制性的,本專業(yè)技術(shù)人員理解,在權(quán)利要 求限定的精神與范圍之內(nèi)可對(duì)其進(jìn)行許多修改、變化或等效,但是它們都將落入本發(fā)明的 保護(hù)范圍內(nèi)。
權(quán)利要求
一種并行計(jì)算的內(nèi)存訪問(wèn)方法,用于存在調(diào)用同一原始執(zhí)行模塊的n≥2個(gè)并行線程的情況,其特征在于,包括以下步驟S1)根據(jù)線程數(shù)n確定需創(chuàng)建的映像執(zhí)行模塊的個(gè)數(shù)k,n-1≥k≥1;S2)確定該n個(gè)線程與原始執(zhí)行模塊及k個(gè)映像執(zhí)行模塊之間的映射策略F;S3)創(chuàng)建k個(gè)映像執(zhí)行模塊,并為其分配各自私有的內(nèi)存池;S4)執(zhí)行所述并行的n個(gè)線程,令各個(gè)線程按照所述映射策略F調(diào)用執(zhí)行模塊,每個(gè)執(zhí)行模塊訪問(wèn)且僅訪問(wèn)其私有的內(nèi)存池;S5)線程運(yùn)行完成后刪除創(chuàng)建的映像執(zhí)行模塊,釋放資源。
2.根據(jù)權(quán)利要求1所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映像執(zhí)行模塊 的個(gè)數(shù)為k是隨時(shí)間變化的。
3.根據(jù)權(quán)利要求1所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映像執(zhí)行模塊 的個(gè)數(shù)k在線程執(zhí)行期間是固定不變的。
4.根據(jù)權(quán)利要求3所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,根據(jù)同一時(shí)間調(diào)用 同一執(zhí)行模塊的線程個(gè)數(shù)的統(tǒng)計(jì)值來(lái)確定映像執(zhí)行模塊的數(shù)量k。
5.根據(jù)權(quán)利要求3所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映像執(zhí)行模塊 的個(gè)數(shù)k為1個(gè)。
6.根據(jù)權(quán)利要求3所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映像執(zhí)行模塊 的個(gè)數(shù)k為n-1個(gè)。
7.根據(jù)權(quán)利要求6所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映射策略F為 每個(gè)線程分別調(diào)用一個(gè)不同的執(zhí)行模塊,線程與執(zhí)行模塊是一一對(duì)應(yīng)的。
8.根據(jù)權(quán)利要求1所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映射策略F為靜 態(tài)策略,一個(gè)線程僅指向一個(gè)被它調(diào)用的執(zhí)行模塊,而一個(gè)執(zhí)行模塊被一個(gè)或一個(gè)以上的 線程調(diào)用。
9.根據(jù)權(quán)利要求8所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映射策略F為將 調(diào)用執(zhí)行模塊頻繁的線程,配置為獨(dú)享一個(gè)執(zhí)行模塊,將相對(duì)調(diào)用執(zhí)行模塊頻率較低的線 程,配置為共享執(zhí)行模塊。
10.根據(jù)權(quán)利要求1所述的并行計(jì)算的內(nèi)存訪問(wèn)方法,其特征在于,所述映射策略F為 動(dòng)態(tài)策略的“多窗口排隊(duì)”機(jī)制,該策略F中,為每個(gè)執(zhí)行模塊定義“空閑”、“繁忙,,兩個(gè)狀 態(tài),將所有的空閑執(zhí)行模塊排隊(duì),需要調(diào)用執(zhí)行模塊的線程從空閑執(zhí)行模塊隊(duì)列中擇一調(diào) 用,若沒(méi)有空閑的則等待;在線程對(duì)執(zhí)行模塊的調(diào)用進(jìn)行中將該執(zhí)行模塊標(biāo)記為繁忙,執(zhí)行 完畢后,線程釋放該執(zhí)行模塊,將其標(biāo)記為空閑。
全文摘要
本發(fā)明涉及一種并行計(jì)算的內(nèi)存訪問(wèn)方法,用于存在調(diào)用同一原始執(zhí)行模塊的n≥2個(gè)并行線程的情況,包括以下步驟S1)根據(jù)線程數(shù)n確定需創(chuàng)建的映像執(zhí)行模塊的個(gè)數(shù)k,n-1≥k≥1;S2)確定該n個(gè)線程與原始執(zhí)行模塊及k個(gè)映像執(zhí)行模塊之間的映射策略F;S3)創(chuàng)建k個(gè)映像執(zhí)行模塊,并為其分配各自私有的內(nèi)存池;S4)執(zhí)行所述并行的n個(gè)線程,令各個(gè)線程按照所述映射策略F調(diào)用執(zhí)行模塊,每個(gè)執(zhí)行模塊訪問(wèn)且僅訪問(wèn)其私有的內(nèi)存池;S5)線程運(yùn)行完成后刪除創(chuàng)建的映像執(zhí)行模塊,釋放資源。本發(fā)明可令并行計(jì)算的效率隨核心數(shù)增加而呈線性增長(zhǎng),而不受內(nèi)存訪問(wèn)瓶頸的限制。各種操作系統(tǒng)通用,且便于將單線程的程序直接移植到多線程環(huán)境。
文檔編號(hào)G06F9/50GK101799773SQ20101014050
公開(kāi)日2010年8月11日 申請(qǐng)日期2010年4月7日 優(yōu)先權(quán)日2010年4月7日
發(fā)明者林芝, 熊雨前 申請(qǐng)人:福州福昕軟件開(kāi)發(fā)有限公司