国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法

      文檔序號:10665776閱讀:312來源:國知局
      一種基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法
      【專利摘要】本發(fā)明公布了一種基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,包括工作線程分組與綁定過程、數(shù)據(jù)區(qū)間劃分過程和任務(wù)執(zhí)行過程;具體包括獲得運行環(huán)境CPU拓撲結(jié)構(gòu)、劃分并綁定工作線程組;數(shù)據(jù)區(qū)間劃分并對應到工作線程組;任務(wù)執(zhí)行采用層次化遍歷的方法,執(zhí)行過程中自動從串行自頂向下狀態(tài)、并行自頂向下狀態(tài)和自底向上狀態(tài)中選擇合適的狀態(tài)作為自身執(zhí)行狀態(tài),當某層處于激活態(tài)的點數(shù)為0時,任務(wù)執(zhí)行結(jié)束。該方法通過任務(wù)劃分減少CPU socket之間的通信,消除CPU socket之間的數(shù)據(jù)一致性維護,通過數(shù)據(jù)綁定和自動切換策略來提高數(shù)據(jù)讀取效率,從而提高程序的運行效率。
      【專利說明】
      一種基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法
      技術(shù)領(lǐng)域
      [0001]本發(fā)明涉及一種并行廣度優(yōu)先搜索方法,具體涉及一種在多socket共享內(nèi)存體系結(jié)構(gòu)上的高效率的并行廣度優(yōu)先搜索的任務(wù)劃分方法和任務(wù)調(diào)度策略。
      【背景技術(shù)】
      [0002]廣度優(yōu)先搜索方法是一種重要的基于圖結(jié)構(gòu)數(shù)據(jù)的搜索方法。圖結(jié)構(gòu)數(shù)據(jù)G通常由一組頂點的集合V和頂點之間的邊的集合E組成。任意一條邊e= (U,V)表示存在一條從頂點u到頂點V的邊。給出一個根頂點r,廣度優(yōu)先搜索方法通過已找到頂點和未找到頂點之間的邊界向外擴展,從而找到根頂點r所能到達的所有頂點。在這一搜索過程中,廣度優(yōu)先搜索方法建立一顆廣度優(yōu)先搜索樹。樹中的父子頂點關(guān)系表示子頂點V由父頂點u擴展到達。廣度優(yōu)先搜索方法的執(zhí)行時間開銷和圖結(jié)構(gòu)數(shù)據(jù)的規(guī)模有關(guān),隨著現(xiàn)代社會的發(fā)展,圖結(jié)構(gòu)數(shù)據(jù)規(guī)模越來越大,串行廣度優(yōu)先方法執(zhí)行時間過長,很難滿足實際使用的需求。
      [0003]并行廣度優(yōu)先方法采用層次遍歷的方式執(zhí)行。在層次遍歷的廣度優(yōu)先方法中,每個頂點有三種狀態(tài),已訪問狀態(tài),未訪問狀態(tài)和激活態(tài)。初始狀態(tài)下,第I層只有根頂點r 一個頂點處于激活態(tài),其他頂點處于未訪問狀態(tài)。第i層遍歷時,方法從第i層的激活態(tài)頂點向第i+Ι層頂點擴展,將第i層處于激活態(tài)的頂點置為已訪問狀態(tài),并將所有搜索到的頂點置為第i+Ι層的激活態(tài)頂點。每層搜索任務(wù)被認為是一個并行計算任務(wù)。方法通過一個隊列frontier儲存當前層處于激活態(tài)的頂點的集合。每層遍歷執(zhí)行時,方法將frontier劃分成不同的區(qū)間分配給不同的線程,每個線程遍歷得到區(qū)間中的頂點并將其處于未訪問狀態(tài)的鄰居加入廣度優(yōu)先搜索樹和并將該鄰居設(shè)為i+Ι層遍歷的激活態(tài)頂點。當某層遍歷結(jié)束后,下一層遍歷處于激活態(tài)的頂點的數(shù)為O時,執(zhí)行結(jié)束。與串行廣度優(yōu)先搜索不同,由于一層遍歷中不同區(qū)間的頂點可能有相同的鄰居,一個處于未訪問狀態(tài)的頂點可能被不同線程同時修改為激活態(tài),這會使得程序結(jié)果異常。為了保證程序的正確性,需要對修改頂點的狀態(tài)的操作加鎖,并維護cache間的數(shù)據(jù)一致性,這些操作降低了使得程序的執(zhí)行效率。
      [0004]2012年,美國的Beamer提出“自頂向下”方法和“自底向上”方法相結(jié)合的并行BFS方法(Beamer, Scott, Krste Asanovic, and David Patterson."Direct1n-optimizingBreadth-First Search.〃SC Conference.1EEE, 2012.) 0 自頂向下方法與層次遍歷的并行廣度優(yōu)先搜索方法類似,通過搜索激活態(tài)頂點的出邊鄰居擴展廣度優(yōu)先搜索樹。自底向上方法采用相反的方法,該方法每次讓所有處于未訪問狀態(tài)的頂點檢查自己的入邊鄰居,如果有一個入邊鄰居處于當前層的激活態(tài),則將該頂點加入下一層遍歷的激活態(tài),同時將該頂點加入廣度優(yōu)先搜索樹,并結(jié)束對這個頂點的處理。自底向上方法適合當前層處于激活態(tài)的頂點較多的情況而自底向下方法適合當前層處于激活態(tài)的頂點較少的情況。Beamer通過動態(tài)的選擇兩種方法來提高廣度優(yōu)先搜索方法的執(zhí)行效率。隨著硬件技術(shù)的發(fā)展,現(xiàn)代共享內(nèi)存計算機越來越多的采用多CPU socket (CPU, Central Processing Unit,中央處理器。CPU socket,CPU插槽)架構(gòu),CPU socket之間的線程通信代價遠大于CPU socket內(nèi)部線程通信代價。在 NUMA(Non Uniform Memory Access Architecture,非統(tǒng)一內(nèi)存訪問)架構(gòu)下,不同CPU socket上的線程對于儲存在不同內(nèi)存的數(shù)據(jù)的訪問效率也不相同。該方法并沒有考慮多CPU socket架構(gòu)下CPU的內(nèi)存讀寫特性和線程間的通信特性,因此在該架構(gòu)下無法高效的執(zhí)行。
      [0005]日本的Yuichiro Yasui的提出了一種基于NUMA架構(gòu)的并行廣度優(yōu)先搜索方法(Yasui, Yuichiro, Katsuki Fujisawa, and Yukinori Sat0.^Fast and Energy-efficientBreadth-First Search on a Single NUMA System.^Supercomputing.SpringerInternat1nal Publishing, 2014.)。它通過將任務(wù)及數(shù)據(jù)分配在不同NUMA節(jié)點上來減少CPU對遠程內(nèi)存的訪問,從而提高廣度優(yōu)先搜索的執(zhí)行速度。該方法在廣度優(yōu)先搜索執(zhí)行前需要將圖數(shù)據(jù)根據(jù)運行環(huán)境的NUMA節(jié)點數(shù)量劃分為不同的子圖,這一操作需要額外的初始化時間。在只需要進行一次廣度優(yōu)先搜索的應用中,這一準備時間是無法承受的。為了維護分割成的子圖的信息,該方法需要額外的存儲空間。另外,對于無向圖,該方法需要將一條邊以入邊和出邊的不同形式儲存兩份,需要兩倍的內(nèi)存空間。對于廣度優(yōu)先方法,增加內(nèi)存消耗限制了系統(tǒng)可以求解問題的規(guī)模。同時該方法需要額外的內(nèi)存儲存子圖信息,該額外空間隨著NUMA節(jié)點數(shù)量的增長而增長,使得該程序擴展性有限。

      【發(fā)明內(nèi)容】

      [0006]為了克服上述現(xiàn)有技術(shù)的不足,本發(fā)明提供一種新的基于共享內(nèi)存的并行廣度優(yōu)先搜索方法,該方法能夠自動感知并適應運行計算機環(huán)境的體系結(jié)構(gòu),同時兼顧計算速度和負載均衡性,在不同計算環(huán)境下都能高效地運行。
      [0007]為了便于說明,本文約定:Nf表示當前層處于激活態(tài)的頂點的數(shù)量;edgefactor表示一張圖中每個頂點的平均邊數(shù);頂點表示圖中的點數(shù)據(jù);節(jié)點表示NUMA計算機運行環(huán)境的機器節(jié)點。
      [0008]本發(fā)明的原理是通過任務(wù)劃分減少CPU socket之間的通信,消除CPU socket之間的數(shù)據(jù)一致性維護,通過數(shù)據(jù)綁定和自動切換策略來提高數(shù)據(jù)讀取效率,從而提高程序的運行效率。
      [0009]本發(fā)明提供的技術(shù)方案是:
      [0010]—種基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,包括工作線程分組與綁定過程、數(shù)據(jù)區(qū)間劃分過程和任務(wù)執(zhí)行過程,具體包括如下步驟:
      [0011]I)工作線程分組與綁定過程,執(zhí)行如下操作:
      [0012]1.1)主線程獲得計算機運行環(huán)境的CPU拓撲結(jié)構(gòu);CPU拓撲結(jié)構(gòu)包括CPU的物理核數(shù)、
      [0013]CPU邏輯核數(shù)和CPU socket數(shù)量;主線程為程序啟動時由操作系統(tǒng)創(chuàng)建的線程;
      [0014]1.2)主線程創(chuàng)建與CPU邏輯核數(shù)相同個數(shù)的工作線程,并將工作線程分為與CPUsocket數(shù)量相同的工作線程組;
      [0015]1.3)根據(jù)步驟1.1)中的CPU拓撲結(jié)構(gòu),將每個工作線程組綁定到CPU socket上;其中,工作線程組與CPU socket為——對應關(guān)系;
      [0016]本發(fā)明實施例在Linux環(huán)境下,結(jié)構(gòu)步驟1.1)具體通過從系統(tǒng)文件/proc/cpuinfo中獲得運行機器的CPU拓撲結(jié)構(gòu)。
      [0017]2)數(shù)據(jù)區(qū)間劃分過程,執(zhí)行如下操作:
      [0018]將原始圖數(shù)據(jù)劃分為與運行環(huán)境中CPU socket個數(shù)相同的區(qū)間,使得每個區(qū)間包含原始圖中連續(xù)的一部分頂點,并且每個區(qū)間內(nèi)頂點的邊數(shù)總和近似相同。不同區(qū)間沒有重復頂點,并且所有區(qū)間的并集為原始圖數(shù)據(jù)。每個工作線程組負責一個數(shù)據(jù)區(qū)間。
      [0019]3)任務(wù)執(zhí)行過程,執(zhí)行如下操作:
      [0020]3.1)執(zhí)行初始時,執(zhí)行狀態(tài)處于自頂向下狀態(tài),除根頂點以外所有頂點處于未訪問狀態(tài),根頂點處于激活態(tài);
      [0021]3.2)執(zhí)行過程中采用層次化遍歷的方法,針對每層,通過檢查圖數(shù)據(jù)中的一部分邊的信息,將部分頂點從未訪問狀態(tài)轉(zhuǎn)化為下一層的激活態(tài),同時將本層的激活態(tài)的頂點轉(zhuǎn)化為已訪問狀態(tài)。根據(jù)運行環(huán)境的不同,執(zhí)行過程中自動從串行自頂向下狀態(tài)、并行自頂向下狀態(tài)和自底向上狀態(tài)中選擇合適的狀態(tài)作為自身執(zhí)行狀態(tài)。當處于串行自頂向下狀態(tài)時,主線程執(zhí)行串行自頂向下方法,各工作線程組休眠;當處于并行自頂向下狀態(tài)時,各工作線程組執(zhí)行并行自頂向下方法;當處于自底向上狀態(tài)時,各工作線程組執(zhí)行自底向上方法。三種方法的執(zhí)行結(jié)果等價,具體來講:
      [0022]3.A串行自頂向下方法:在每一層遍歷中,該方法工作線程組休眠,主線程檢查處于所有激活態(tài)的頂點的所有鄰居。當被檢查的出邊找到一個處于未訪問狀態(tài)的鄰居時,將該鄰居加入下一層的激活態(tài)頂點集并且將該鄰居加入廣度優(yōu)先搜索樹。
      [0023]3.B并行自頂向下方法:在每一層遍歷中,該方法中每個工作線程組遍歷該層中的所有激活態(tài)頂點,并且檢查該工作線程組所負責區(qū)間內(nèi)的所有出邊。當被檢查的出邊找至IJ 一個處于未訪問狀態(tài)的鄰居時,將該鄰居加入下一層的激活態(tài)頂點集并且將該鄰居加入廣度優(yōu)先搜索樹。
      [0024]3.C自底向上方法:在每一層遍歷中,該方法中的每個工作線程組遍歷它所負責區(qū)間內(nèi)的所有頂點。當檢查頂點V時,如果該頂點V處于未訪問狀態(tài),則檢查它的所有入邊,如果找到一個入邊的源頂點處于激活態(tài),則將頂點V加入下一層的激活態(tài)頂點集和廣度優(yōu)先搜索樹,同時結(jié)束對頂點V的鄰居的檢查。
      [0025]3.3)當某層處于激活態(tài)的頂點數(shù)Nf為O時,任務(wù)執(zhí)行結(jié)束。
      [0026]作為一種優(yōu)選方案,如果運行機器為NUMA (Non Uniform Memory AccessArchitecture,非統(tǒng)一內(nèi)存訪問)架構(gòu),過程2)數(shù)據(jù)區(qū)間劃分中的不同區(qū)間的數(shù)據(jù)可以存儲到不同NUMA節(jié)點的本地內(nèi)存上去,從而提高數(shù)據(jù)讀取效率。由于每個工作線程組負責一個數(shù)據(jù)區(qū)域,CPUsocket上的工作線程組可將讀取的數(shù)據(jù)存儲在離該CPU socket最近的NUMA節(jié)點內(nèi)存上,以提高數(shù)據(jù)讀取效率。
      [0027]作為一種優(yōu)選方案,對于非規(guī)則的圖數(shù)據(jù),在過程3)中,用戶可以指定任務(wù)執(zhí)行在自底向上狀態(tài)使用帶有負載均衡策略的自底向上方法。帶有負載均衡策略的自底向上方法的工作線程組所負責的數(shù)據(jù)區(qū)間分配方式與普通自底向上方法相同,只是在任務(wù)執(zhí)行時有所差別。任務(wù)執(zhí)行時,每個工作線程組訪問完成自己所負責的區(qū)間內(nèi)的所有頂點以后,檢查其他工作線程組所負責區(qū)間的執(zhí)行情況。如果發(fā)現(xiàn)其他工作線程組未完成自己區(qū)間的檢查,則從其中獲取區(qū)間任務(wù)片段執(zhí)行,從而提高負載均衡性。
      [0028]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
      [0029]利用本發(fā)明提供的技術(shù)方案,可以使得廣度優(yōu)先搜索方法在很小的初始化時間和不改變內(nèi)存使用量的條件下,更好的感知和利用運行環(huán)境的體系結(jié)構(gòu)特點,減少訪問沖突,提尚訪存效率,進而提尚程序運彳丁速度。
      【附圖說明】
      [0030]圖1是本發(fā)明進行工作線程分組與綁定過程的流程框圖。
      [0031]圖2是本發(fā)明進行任務(wù)執(zhí)行過程的流程框圖;
      [0032]其中,α、β、γ是用戶指定參數(shù);該三個用戶指定參數(shù)決定方法在各狀態(tài)間切換的時機,其取值要求滿足β *edgefactor> γ ;η為輸入圖數(shù)據(jù)的頂點數(shù);Nf表示當前層處于激活態(tài)的頂點的數(shù)量;edgefactor表示一張圖中每個頂點的平均邊數(shù);框圖中各狀態(tài)之間的轉(zhuǎn)移條件如下:
      [0033]I:Nf> α 并且 Nf*edgefactor* β <η ;
      [0034]2:Nf< α ;
      [0035]3:Nf> α 并且 Nf*edgefactor* β >n ;
      [0036]4:Nf< a ;
      [0037]5:Nf> a 并且 Nf*edgefactor* β >n ;
      [0038]6:Nf> α 并且 Nf* γ <n ;
      [0039]7:Nf< a ;
      [0040]8:Nf> a 并且 Nf*edgefactor* β <n ;
      [0041 ] 9:Nf> α 并且 Nf* γ >n ;
      [0042]10:Nf= O0
      【具體實施方式】
      [0043]下面結(jié)合附圖,通過實施例進一步描述本發(fā)明,但不以任何方式限制本發(fā)明的范圍。
      [0044]本發(fā)明提供的基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法包括工作線程分組與綁定過程、數(shù)據(jù)區(qū)間劃分過程和任務(wù)執(zhí)行過程。
      [0045]圖1是本發(fā)明進行工作線程分組與綁定過程的流程框圖。如圖1所示,工作線程分組與綁定過程包括獲得CPU拓撲結(jié)構(gòu)、生成工作線程并分組、將工作線程組綁定到CPUsocket上;具體如下:
      [0046]I)工作線程分組與綁定過程:
      [0047]1.1)主線程獲得運行環(huán)境的CPU拓撲結(jié)構(gòu)。
      [0048]具體實施在Linux環(huán)境下,通過從系統(tǒng)文件/proc/cpuinfo中獲得機器的CPU拓撲結(jié)構(gòu),包括CPU的物理核數(shù),邏輯核數(shù),socket數(shù)量。
      [0049]1.2)生成與CPU邏輯核數(shù)相同個數(shù)的工作線程,并將它們分為與socket數(shù)量相同的工作線程組。假設(shè)機器有s個socket和P個邏輯核,則生成P個工作線程,并將它們分為s組,每組s/p個工作線程。
      [0050]1.3)根據(jù)CPU拓撲結(jié)構(gòu)將不同工作線程組綁定到不同CPU socket上。通過設(shè)置工作線程對CPU的親和性,可以指定工作線程在哪些CPU上執(zhí)行。對于每個工作線程組,將其分配給一個CPU socket,即指定該工作線程組內(nèi)的所有工作線程在且只在該socket內(nèi)的邏輯核上執(zhí)行。
      [0051]2數(shù)據(jù)區(qū)間劃分過程:
      [0052]將圖劃分為與執(zhí)行環(huán)境中CPU socket個數(shù)相同的的區(qū)間,使得每個區(qū)間包含圖中連續(xù)的一部分頂點,并且每個區(qū)間內(nèi)頂點的邊數(shù)總和近似相同。不同區(qū)間沒有重復頂點,并且所有區(qū)間的并集為原始圖數(shù)據(jù)。假設(shè)輸入數(shù)據(jù)有η個頂點,m條邊,機器有s個socket,則數(shù)據(jù)分組方法如下:
      [0053]將頂點集合V分為連續(xù)的P個子集:V= [Vl|…I Vp],并且依據(jù)頂點的分組將邊劃分為P個連續(xù)的子集E = [El I…IEp],其中Ei = [(U,V) V e Vi],即每個邊的子集中邊的目標頂點屬于對應的頂點的子集。對于頂點集V的分組,每個子集的頂點的范圍取值滿足如下條件,對于任意i,頂點的子集Vi的范圍使得邊的子集Ei內(nèi)邊的數(shù)量盡量接近于m/s。
      [0054]數(shù)據(jù)區(qū)間劃分完畢后,在任務(wù)執(zhí)行時每個工作線程組負責一個數(shù)據(jù)區(qū)間內(nèi)的任務(wù)。
      [0055]作為一種優(yōu)選方案,如果運行機器為NUMA (Non Uniform Memory AccessArchitecture,非統(tǒng)一內(nèi)存訪問)架構(gòu),過程2)數(shù)據(jù)區(qū)間劃分中的不同區(qū)間的數(shù)據(jù)可以存儲到不同NUMA節(jié)點內(nèi)存上去,從而提高數(shù)據(jù)讀取效率。
      [0056]3)任務(wù)執(zhí)行:
      [0057]圖2是本發(fā)明進行任務(wù)執(zhí)行過程的流程框圖;其中,α、β、γ是用戶指定參數(shù);該三個用戶指定參數(shù)決定方法在各狀態(tài)間切換的時機,其取值要求滿足β *edgefaCtor> γ ;η為輸入圖數(shù)據(jù)的頂點數(shù);Nf表示當前層處于激活態(tài)的頂點的數(shù)量edgefactor表示一張圖中每個頂點的平均邊數(shù)。任務(wù)執(zhí)行時采用層次化遍歷的方法,每層通過檢查圖數(shù)據(jù)中的一部分邊的信息,將部分頂點從未訪問狀態(tài)轉(zhuǎn)化為下一層的激活態(tài),同時將本層的激活態(tài)的頂點轉(zhuǎn)化為已訪問狀態(tài)。任務(wù)執(zhí)行初始時處于串行自頂向下狀態(tài),選擇串行自頂向下方法,只有根頂點處于激活態(tài),其他頂點處于未訪問狀態(tài)。任務(wù)執(zhí)行過程中,根據(jù)運行時狀態(tài),自動在串行自頂向下狀態(tài),并行自頂向下狀態(tài)和自底向上狀態(tài)間切換,具體地:
      [0058]當執(zhí)行狀態(tài)處于串行自頂向下狀態(tài)時,狀態(tài)間切換的方法具體為:
      [0059]A.若當前層處于激活態(tài)的頂點數(shù)Nf小于α,方法保持串行自頂向下狀態(tài);
      [0060]B.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)N f乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)β小于圖的頂點數(shù)η時,方法從串行自頂向下狀態(tài)切換成并行自頂向下狀態(tài);
      [0061]C.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)β大于圖的頂點數(shù)η時,方法從串行自頂向下狀態(tài)切換成自底向上狀態(tài)。
      [0062]當執(zhí)行狀態(tài)處于并行自頂向下狀態(tài)時,狀態(tài)間切換的方法具體為:
      [0063]Α.若當前層處于激活態(tài)的頂點數(shù)Nf小于α,方法從并行自頂向下狀態(tài)切換成串行自頂向下狀態(tài);
      [0064]B.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)N f乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)β大于圖的頂點數(shù)η時,方法從并行自頂向下狀態(tài)切換成自底向上狀態(tài);
      [0065]C.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)N f乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)α小于圖的頂點數(shù)η時,方法保持并行自頂向下狀
      ??τ O
      [0066]當執(zhí)行狀態(tài)處于自底向上狀態(tài)時,狀態(tài)間切換的方法具體為:
      [0067]Α.若當前層處于激活態(tài)的頂點數(shù)Nf小于α,方法從自底向上狀態(tài)切換成串行自頂向下狀態(tài);
      [0068]B.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)N f乘以edgefactor再乘以轉(zhuǎn)換參數(shù)γ小于圖中頂點數(shù)η,方法從自底向上狀態(tài)切換成并行自頂向下狀態(tài);
      [0069]C.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)N f乘以edgefactor再乘以轉(zhuǎn)換參數(shù)γ大于圖中頂點數(shù)η,方法保持自底向上狀態(tài)。
      [0070]串行自頂向下、并行自頂向下和自底向上三種方法輸入?yún)?shù)和輸出結(jié)果均等價,只是執(zhí)行過程不同,適用于不同情況。具體來講:
      [0071]3.A串行自頂向下方法。當處于激活態(tài)的頂點很少時,方法的同步時間和線程通信時間將會大于該層的執(zhí)行時間。為了避免多于的同步開銷和線程通信開銷,在處于激活態(tài)的頂點很少的層數(shù)上,方法使用串行自頂向下方法。該方法主線程并不喚醒各工作線程組,而是親自檢查處于所有激活態(tài)的頂點的所有鄰居。當被檢查的出邊找到一個處于未訪問狀態(tài)的鄰居時,將該鄰居加入下一層的激活態(tài)頂點集并且將該鄰居加入廣度優(yōu)先搜索樹。在該方法中,激活態(tài)頂點用數(shù)組儲存序號表示。
      [0072]3.B并行自頂向下方法。在一層遍歷中,并行自頂向下方法的每個工作線程組執(zhí)行一個區(qū)間內(nèi)的任務(wù)。對于任意一個工作線程組,組內(nèi)所有工作線程并行的遍歷所有處于激活態(tài)的頂點,通常是每個工作線程取激活態(tài)的頂點的一個或幾個子集檢查。對于一個工作線程,當取得一個子集后,將檢查該子集內(nèi)頂點的出邊鄰居。如果該鄰居不屬于該工作線程組所負責的區(qū)間則跳過;否則工作線程檢查該鄰居的狀態(tài)。如果該鄰居處于未訪問狀態(tài),則將該鄰居加入下一層的激活態(tài)頂點集并且將該鄰居加入廣度優(yōu)先搜索樹。在該方法中,激活態(tài)頂點用數(shù)組儲存序號表示。
      [0073]3.C自底向上方法。在一層遍歷中,自底向上方法的每個工作線程組遍歷所負責區(qū)間內(nèi)的所有頂點。同一工作線程組內(nèi)的工作線程并行的遍歷所負責區(qū)間內(nèi)的所有頂點,并判斷頂點的狀態(tài)。如果該頂點處于已訪問狀態(tài)或者激活態(tài),則跳過。如果該頂點處于未訪問狀態(tài),則檢查它的所有入邊鄰居。如果找到一個入邊鄰居處于激活態(tài),則將該頂點加入下一層激活態(tài)和廣度優(yōu)先搜索樹,同時結(jié)束對該頂點剩余鄰居的檢查。在該方法中,激活態(tài)頂點使用位圖方式表示。位圖位數(shù)為頂點的數(shù)量,每一位對應一個頂點。該位為O時表示該頂點不處于激活態(tài),該位為I時表示該頂點屬于激活態(tài)。
      [0074]當某層激活態(tài)的頂點數(shù)Nf為O時,任務(wù)執(zhí)行結(jié)束。
      [0075]作為一種優(yōu)選方案,對于非規(guī)則的圖數(shù)據(jù),在過程3)任務(wù)執(zhí)行中,用戶可以指定方法在自底向上狀態(tài)使用帶有負載均衡策略的自底向上方法。帶有負載均衡策略的自底向上方法的工作線程組所負責的數(shù)據(jù)區(qū)間分配方式與普通自底向上方法相同,只是在任務(wù)執(zhí)行時有所差別。任務(wù)執(zhí)行時,每個工作線程組訪問完成自己所負責的區(qū)間內(nèi)的所有頂點以后,檢查其他工作線程組所負責區(qū)間的執(zhí)行情況。如果發(fā)現(xiàn)其他工作線程組未完成自己區(qū)間的檢查,則從其中獲取區(qū)間任務(wù)片段執(zhí)行,從而提高負載均衡性。
      [0076]下面通過實例對本發(fā)明做進一步說明。
      [0077]本實施例使用一臺Dell PowerEdge R820服務(wù)器,在一個頂點數(shù)為3072441、邊數(shù)為234370166的社交圖數(shù)據(jù)orkut上,運行以ID為2792870的頂點為根頂點的廣度優(yōu)先搜索方法。orkut是一個社交網(wǎng)站,該數(shù)據(jù)頂點表示網(wǎng)站用戶,邊表示網(wǎng)站用戶間的好友關(guān)系。本發(fā)明提供的廣度優(yōu)先搜索方法具體包括如下過程和步驟:
      [0078]I)工作線程分組與綁定過程:
      [0079]1.1)獲得運行環(huán)境的CPU拓撲結(jié)構(gòu)。程序通過讀取系統(tǒng)文件/proc/cpuinfo得到機器的CPU拓撲結(jié)構(gòu)。/proc/cpuinfo文件中processor字段表示邏輯核ID,physical id字段表示該邏輯核所在的socket id。本機器共有64個邏輯核和4個socket,其中O、4、8、12、16、20、24、28、32、36、40、44、48、52、56、60 邏輯核屬于第一個 socket,1、5、9、13、17、21、25、29、33、37、41、45、49、53、57、61 號邏輯核屬于第二個 socket,2、6、10、14、18、22、26、30、34、38、42、46、50、54、58、62 號邏輯核屬于第三個 socket,3、7、11、15、19、23、27、31、35、39、43、47、51、55、59、63號邏輯核屬于第四個socket。
      [0080]1.2)通過pthread_create O創(chuàng)建64個工作線程,每16個工作線程分為I組。通過pthread_setaffinity_np O將不同工作線程綁定在不同的socket上,同組工作線程綁定在同一個socket上。以O(shè)號工作線程為例,綁定方法如下:
      [0081]1.2.1)獲得O號邏輯核所在的socket,設(shè)為S,并根據(jù)CPU拓撲結(jié)構(gòu)獲得該socket上所有邏輯核的ID。
      [0082]1.2.2)對于O號工作線程的cpuset中的第i位,若邏輯核i在socket s上,貝丨J置I,否則置O。
      [0083]1.2.3)利用系統(tǒng) api pthread_setaff inity_np ()將工作線程 I 的 cpu 親和性設(shè)置為I號工作線程cpuset所代表的親和性。
      [0084]2)數(shù)據(jù)區(qū)間劃分:
      [0085]運行機器環(huán)境有4個socket,則待處理圖應該被分為邊數(shù)相等的4個連續(xù)區(qū)間,每個區(qū)間邊數(shù)近似相同。對于圖orkut,四個區(qū)間的起始位置和終止位置分邊為頂點O到頂點416767、頂點416768到頂點1202175、頂點1202176到頂點2357247、頂點2357248到頂點3072441,每個區(qū)間的邊數(shù)分別為 58592810 ;58592333 ;58592787 ;58592236。
      [0086]任務(wù)執(zhí)行時,每個工作線程組將處理一個區(qū)間內(nèi)的任務(wù),即工作線程組I處理頂點O到頂點416767上的任務(wù)、工作線程組2處理頂點416768到頂點1202175上的任務(wù)、工作線程組3處理頂點1202176到頂點2357247上的任務(wù)、工作線程組4處理頂點2357248到頂點3072441上的任務(wù)。
      [0087]3)任務(wù)執(zhí)行:
      [0088]對于orkut圖,方法取參數(shù)α = 10,β = 256,γ = 256,方法狀態(tài)自動切換過程如下:
      [0089]初始狀態(tài)下,處于激活態(tài)的頂點為根頂點,方法處于串行自頂向下狀態(tài),選擇串行自頂向下方法。
      [0090]第一層遍歷后,處于激活態(tài)的頂點共有19個,方法從串行自頂向下狀態(tài)切換至并行自頂向下狀態(tài)。
      [0091]第二層遍歷后,處于激活態(tài)的頂點共有2745個,方法從并行自頂向下狀態(tài)切換到自底向上狀態(tài)。
      [0092]第三層遍歷后,處于激活態(tài)的頂點共有238638個,方法保持自底向上狀態(tài)。
      [0093]第四層遍歷后,處于激活態(tài)的頂點共有2245002個,方法保持自底向上狀態(tài)。
      [0094]第五層遍歷后,處于激活態(tài)的頂點共有582417個,方法保持自底向上狀態(tài)。
      [0095]第六層遍歷后,處于激活態(tài)的頂點共有3536個,方法從自底向上狀態(tài)切換到并行自頂向下狀態(tài)。
      [0096]第七層遍歷后,處于激活態(tài)的頂點共有83個,方法保持并行自頂向下狀態(tài)。
      [0097]第八層遍歷后,處于激活態(tài)的頂點共有O個,方法執(zhí)行結(jié)束。
      [0098]需要注意的是,公布實施例的目的在于幫助進一步理解本發(fā)明,但是本領(lǐng)域的技術(shù)人員可以理解:在不脫離本發(fā)明及所附權(quán)利要求的精神和范圍內(nèi),各種替換和修改都是可能的。因此,本發(fā)明不應局限于實施例所公開的內(nèi)容,本發(fā)明要求保護的范圍以權(quán)利要求書界定的范圍為準。
      【主權(quán)項】
      1.一種基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,包括工作線程分組與綁定過程、數(shù)據(jù)區(qū)間劃分過程和任務(wù)執(zhí)行過程,具體包括如下步驟: 1)工作線程分組與綁定過程,執(zhí)行如下操作: 1.1)主線程獲得計算機運行環(huán)境的CPU拓撲結(jié)構(gòu);所述CPU拓撲結(jié)構(gòu)包括CPU的物理核數(shù)、CPU邏輯核數(shù)和CPU socket數(shù)量; 1.2)主線程生成與CPU邏輯核數(shù)相同個數(shù)的工作線程,并將工作線程分為與CPUsocket數(shù)量相同的工作線程組; 1.3)根據(jù)步驟1.1)所述CPU拓撲結(jié)構(gòu),將每個工作線程組綁定到CPU socket上;工作線程組與CPU socket為——對應關(guān)系; 2)數(shù)據(jù)區(qū)間劃分過程,執(zhí)行如下操作: 將原始圖數(shù)據(jù)劃分為與步驟1.1)所述CPU socket數(shù)量相同的數(shù)據(jù)區(qū)間,使得每個數(shù)據(jù)區(qū)間滿足:每個數(shù)據(jù)區(qū)間包含原始圖中連續(xù)的一部分頂點,并且每個數(shù)據(jù)區(qū)間內(nèi)頂點的邊數(shù)總和近似相同;不同數(shù)據(jù)區(qū)間沒有重復頂點;所有數(shù)據(jù)區(qū)間的并集為原始圖數(shù)據(jù); 每個工作線程組負責一個數(shù)據(jù)區(qū)間; 3)任務(wù)執(zhí)行過程,執(zhí)行如下操作: 3.1)執(zhí)行初始時,執(zhí)行狀態(tài)處于自頂向下狀態(tài),除根頂點以外所有頂點處于未訪問狀態(tài),根頂點處于激活態(tài); 3.2)執(zhí)行過程中,采用層次化遍歷的方法,針對每層,通過檢查圖數(shù)據(jù)中的一部分邊的信息,從串行自頂向下狀態(tài)、并行自頂向下狀態(tài)和自底向上狀態(tài)中選擇一種狀態(tài)作為執(zhí)行狀態(tài);當處于串行自頂向下狀態(tài)時,主線程執(zhí)行串行自頂向下方法,各工作線程組休眠;當處于并行自頂向下狀態(tài)時,各工作線程組執(zhí)行并行自頂向下方法;當處于自底向上狀態(tài)時,各工作線程組執(zhí)行自底向上方法; 3.3)當某層處于激活態(tài)的頂點數(shù)為O時,任務(wù)執(zhí)行結(jié)束。2.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟1.D所述計算機運行環(huán)境為非統(tǒng)一內(nèi)存訪問架構(gòu),步驟2)所述數(shù)據(jù)區(qū)間劃分中的不同區(qū)間的數(shù)據(jù)可以存儲到不同節(jié)點內(nèi)存上,從而提高數(shù)據(jù)讀取效率。3.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟2)所述數(shù)據(jù)為非規(guī)則的圖數(shù)據(jù),步驟3.2)所述當處于自底向上狀態(tài)時,各工作線程組執(zhí)行自底向上方法具體為帶有負載均衡策略的自底向上方法,從而提高負載均衡性。4.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟3.2)所述串行自頂向下方法具體為:在每一層遍歷中,工作線程組休眠,主線程檢查處于所有激活態(tài)的頂點的所有鄰居;當被檢查的出邊找到一個處于未訪問狀態(tài)的鄰居時,將該鄰居加入下一層的激活態(tài)頂點集并且將該鄰居加入廣度優(yōu)先搜索樹。5.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟3.2)所述并行自頂向下方法具體為:在每一層遍歷中,每個工作線程組遍歷該層中的所有激活態(tài)頂點,并且檢查該工作線程組所負責區(qū)間內(nèi)的所有出邊;當被檢查的出邊找到一個處于未訪問狀態(tài)的鄰居時,將該鄰居加入下一層的激活態(tài)頂點集并且將該鄰居加入廣度優(yōu)先搜索樹。6.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟3.2)所述自底向上方法具體為:在每一層遍歷中,每個工作線程組遍歷它所負責區(qū)間內(nèi)的所有頂點;當檢查頂點V時,如果該頂點V處于未訪問狀態(tài),則檢查它的所有入邊,如果找到一個入邊的源頂點處于激活態(tài),則將頂點V加入下一層的激活態(tài)頂點集和廣度優(yōu)先搜索樹,同時結(jié)束對頂點V的鄰居的檢查。7.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟3.2)所述從串行自頂向下狀態(tài)、并行自頂向下狀態(tài)和自底向上狀態(tài)中選擇一種狀態(tài)作為執(zhí)行狀態(tài),所述串行自頂向下狀態(tài)、并行自頂向下狀態(tài)和自底向上狀態(tài)之間的切換方法具體為:設(shè)定參數(shù)α、β和γ,滿足β *edgefactor> γ ;設(shè)定η為輸入圖數(shù)據(jù)的頂點數(shù);設(shè)定Nf表示當前層處于激活態(tài)的頂點的數(shù)量;設(shè)定edgefactor表示一張圖中每個頂點的平均邊數(shù); 當執(zhí)行狀態(tài)處于串行自頂向下狀態(tài)時: A.若當前層處于激活態(tài)的頂點數(shù)Nf小于α,保持串行自頂向下狀態(tài); B.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)β小于圖的頂點數(shù)η時,執(zhí)行狀態(tài)從串行自頂向下狀態(tài)切換成并行自頂向下狀態(tài); C.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)β大于圖的頂點數(shù)η時,執(zhí)行狀態(tài)從串行自頂向下狀態(tài)切換成自底向上狀態(tài); 當執(zhí)行狀態(tài)處于并行自頂向下狀態(tài)時,狀態(tài)間切換的方法具體為: Α.若當前層處于激活態(tài)的頂點數(shù)Nf小于α,執(zhí)行狀態(tài)從并行自頂向下狀態(tài)切換成串行自頂向下狀態(tài); B.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)β大于圖的頂點數(shù)η時,執(zhí)行狀態(tài)從并行自頂向下狀態(tài)切換成自底向上狀態(tài); C.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以乘以轉(zhuǎn)換參數(shù)α小于圖的頂點數(shù)η時,執(zhí)行狀態(tài)保持并行自頂向下狀態(tài); 當執(zhí)行狀態(tài)處于自底向上狀態(tài)時,狀態(tài)間切換的方法具體為: Α.若當前層處于激活態(tài)的頂點數(shù)Nf小于α,執(zhí)行狀態(tài)從自底向上狀態(tài)切換成串行自頂向下狀態(tài); B.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以轉(zhuǎn)換參數(shù)γ小于圖中頂點數(shù)η,執(zhí)行狀態(tài)從自底向上狀態(tài)切換成并行自頂向下狀態(tài); C.若當前層處于激活態(tài)的頂點數(shù)Nf大于α,并且當前層處于激活態(tài)的頂點數(shù)Nf乘以edgefactor再乘以轉(zhuǎn)換參數(shù)γ大于圖中頂點數(shù)η,執(zhí)行狀態(tài)保持自底向上狀態(tài)。8.如權(quán)利要求7所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,所述參數(shù)取值為:α = 10,β = 256,γ = 256。9.如權(quán)利要求1所述基于共享內(nèi)存體系結(jié)構(gòu)的并行廣度優(yōu)先搜索方法,其特征是,步驟2)所述原始圖數(shù)據(jù)具體是頂點數(shù)為3072441、邊數(shù)為234370166的orkut社交圖數(shù)據(jù)。
      【文檔編號】G06F17/30GK106033442SQ201510113383
      【公開日】2016年10月19日
      【申請日】2015年3月16日
      【發(fā)明人】余華山, 胡子千, 王娜, 孟佳
      【申請人】北京大學
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1