一种基于共享内存体系结构的并行广度优先搜索方法

文档序号:10665776阅读:276来源:国知局
一种基于共享内存体系结构的并行广度优先搜索方法
【专利摘要】本发明公布了一种基于共享内存体系结构的并行广度优先搜索方法,包括工作线程分组与绑定过程、数据区间划分过程和任务执行过程;具体包括获得运行环境CPU拓扑结构、划分并绑定工作线程组;数据区间划分并对应到工作线程组;任务执行采用层次化遍历的方法,执行过程中自动从串行自顶向下状态、并行自顶向下状态和自底向上状态中选择合适的状态作为自身执行状态,当某层处于激活态的点数为0时,任务执行结束。该方法通过任务划分减少CPU socket之间的通信,消除CPU socket之间的数据一致性维护,通过数据绑定和自动切换策略来提高数据读取效率,从而提高程序的运行效率。
【专利说明】
一种基于共享内存体系结构的并行广度优先搜索方法
技术领域
[0001]本发明涉及一种并行广度优先搜索方法,具体涉及一种在多socket共享内存体系结构上的高效率的并行广度优先搜索的任务划分方法和任务调度策略。
【背景技术】
[0002]广度优先搜索方法是一种重要的基于图结构数据的搜索方法。图结构数据G通常由一组顶点的集合V和顶点之间的边的集合E组成。任意一条边e= (U,V)表示存在一条从顶点u到顶点V的边。给出一个根顶点r,广度优先搜索方法通过已找到顶点和未找到顶点之间的边界向外扩展,从而找到根顶点r所能到达的所有顶点。在这一搜索过程中,广度优先搜索方法建立一颗广度优先搜索树。树中的父子顶点关系表示子顶点V由父顶点u扩展到达。广度优先搜索方法的执行时间开销和图结构数据的规模有关,随着现代社会的发展,图结构数据规模越来越大,串行广度优先方法执行时间过长,很难满足实际使用的需求。
[0003]并行广度优先方法采用层次遍历的方式执行。在层次遍历的广度优先方法中,每个顶点有三种状态,已访问状态,未访问状态和激活态。初始状态下,第I层只有根顶点r 一个顶点处于激活态,其他顶点处于未访问状态。第i层遍历时,方法从第i层的激活态顶点向第i+Ι层顶点扩展,将第i层处于激活态的顶点置为已访问状态,并将所有搜索到的顶点置为第i+Ι层的激活态顶点。每层搜索任务被认为是一个并行计算任务。方法通过一个队列frontier储存当前层处于激活态的顶点的集合。每层遍历执行时,方法将frontier划分成不同的区间分配给不同的线程,每个线程遍历得到区间中的顶点并将其处于未访问状态的邻居加入广度优先搜索树和并将该邻居设为i+Ι层遍历的激活态顶点。当某层遍历结束后,下一层遍历处于激活态的顶点的数为O时,执行结束。与串行广度优先搜索不同,由于一层遍历中不同区间的顶点可能有相同的邻居,一个处于未访问状态的顶点可能被不同线程同时修改为激活态,这会使得程序结果异常。为了保证程序的正确性,需要对修改顶点的状态的操作加锁,并维护cache间的数据一致性,这些操作降低了使得程序的执行效率。
[0004]2012年,美国的Beamer提出“自顶向下”方法和“自底向上”方法相结合的并行BFS方法(Beamer, Scott, Krste Asanovic, and David Patterson."Direct1n-optimizingBreadth-First Search.〃SC Conference.1EEE, 2012.) 0 自顶向下方法与层次遍历的并行广度优先搜索方法类似,通过搜索激活态顶点的出边邻居扩展广度优先搜索树。自底向上方法采用相反的方法,该方法每次让所有处于未访问状态的顶点检查自己的入边邻居,如果有一个入边邻居处于当前层的激活态,则将该顶点加入下一层遍历的激活态,同时将该顶点加入广度优先搜索树,并结束对这个顶点的处理。自底向上方法适合当前层处于激活态的顶点较多的情况而自底向下方法适合当前层处于激活态的顶点较少的情况。Beamer通过动态的选择两种方法来提高广度优先搜索方法的执行效率。随着硬件技术的发展,现代共享内存计算机越来越多的采用多CPU socket (CPU, Central Processing Unit,中央处理器。CPU socket,CPU插槽)架构,CPU socket之间的线程通信代价远大于CPU socket内部线程通信代价。在 NUMA(Non Uniform Memory Access Architecture,非统一内存访问)架构下,不同CPU socket上的线程对于储存在不同内存的数据的访问效率也不相同。该方法并没有考虑多CPU socket架构下CPU的内存读写特性和线程间的通信特性,因此在该架构下无法高效的执行。
[0005]日本的Yuichiro Yasui的提出了一种基于NUMA架构的并行广度优先搜索方法(Yasui, Yuichiro, Katsuki Fujisawa, and Yukinori Sat0.^Fast and Energy-efficientBreadth-First Search on a Single NUMA System.^Supercomputing.SpringerInternat1nal Publishing, 2014.)。它通过将任务及数据分配在不同NUMA节点上来减少CPU对远程内存的访问,从而提高广度优先搜索的执行速度。该方法在广度优先搜索执行前需要将图数据根据运行环境的NUMA节点数量划分为不同的子图,这一操作需要额外的初始化时间。在只需要进行一次广度优先搜索的应用中,这一准备时间是无法承受的。为了维护分割成的子图的信息,该方法需要额外的存储空间。另外,对于无向图,该方法需要将一条边以入边和出边的不同形式储存两份,需要两倍的内存空间。对于广度优先方法,增加内存消耗限制了系统可以求解问题的规模。同时该方法需要额外的内存储存子图信息,该额外空间随着NUMA节点数量的增长而增长,使得该程序扩展性有限。

【发明内容】

[0006]为了克服上述现有技术的不足,本发明提供一种新的基于共享内存的并行广度优先搜索方法,该方法能够自动感知并适应运行计算机环境的体系结构,同时兼顾计算速度和负载均衡性,在不同计算环境下都能高效地运行。
[0007]为了便于说明,本文约定:Nf表示当前层处于激活态的顶点的数量;edgefactor表示一张图中每个顶点的平均边数;顶点表示图中的点数据;节点表示NUMA计算机运行环境的机器节点。
[0008]本发明的原理是通过任务划分减少CPU socket之间的通信,消除CPU socket之间的数据一致性维护,通过数据绑定和自动切换策略来提高数据读取效率,从而提高程序的运行效率。
[0009]本发明提供的技术方案是:
[0010]—种基于共享内存体系结构的并行广度优先搜索方法,包括工作线程分组与绑定过程、数据区间划分过程和任务执行过程,具体包括如下步骤:
[0011]I)工作线程分组与绑定过程,执行如下操作:
[0012]1.1)主线程获得计算机运行环境的CPU拓扑结构;CPU拓扑结构包括CPU的物理核数、
[0013]CPU逻辑核数和CPU socket数量;主线程为程序启动时由操作系统创建的线程;
[0014]1.2)主线程创建与CPU逻辑核数相同个数的工作线程,并将工作线程分为与CPUsocket数量相同的工作线程组;
[0015]1.3)根据步骤1.1)中的CPU拓扑结构,将每个工作线程组绑定到CPU socket上;其中,工作线程组与CPU socket为——对应关系;
[0016]本发明实施例在Linux环境下,结构步骤1.1)具体通过从系统文件/proc/cpuinfo中获得运行机器的CPU拓扑结构。
[0017]2)数据区间划分过程,执行如下操作:
[0018]将原始图数据划分为与运行环境中CPU socket个数相同的区间,使得每个区间包含原始图中连续的一部分顶点,并且每个区间内顶点的边数总和近似相同。不同区间没有重复顶点,并且所有区间的并集为原始图数据。每个工作线程组负责一个数据区间。
[0019]3)任务执行过程,执行如下操作:
[0020]3.1)执行初始时,执行状态处于自顶向下状态,除根顶点以外所有顶点处于未访问状态,根顶点处于激活态;
[0021]3.2)执行过程中采用层次化遍历的方法,针对每层,通过检查图数据中的一部分边的信息,将部分顶点从未访问状态转化为下一层的激活态,同时将本层的激活态的顶点转化为已访问状态。根据运行环境的不同,执行过程中自动从串行自顶向下状态、并行自顶向下状态和自底向上状态中选择合适的状态作为自身执行状态。当处于串行自顶向下状态时,主线程执行串行自顶向下方法,各工作线程组休眠;当处于并行自顶向下状态时,各工作线程组执行并行自顶向下方法;当处于自底向上状态时,各工作线程组执行自底向上方法。三种方法的执行结果等价,具体来讲:
[0022]3.A串行自顶向下方法:在每一层遍历中,该方法工作线程组休眠,主线程检查处于所有激活态的顶点的所有邻居。当被检查的出边找到一个处于未访问状态的邻居时,将该邻居加入下一层的激活态顶点集并且将该邻居加入广度优先搜索树。
[0023]3.B并行自顶向下方法:在每一层遍历中,该方法中每个工作线程组遍历该层中的所有激活态顶点,并且检查该工作线程组所负责区间内的所有出边。当被检查的出边找至IJ 一个处于未访问状态的邻居时,将该邻居加入下一层的激活态顶点集并且将该邻居加入广度优先搜索树。
[0024]3.C自底向上方法:在每一层遍历中,该方法中的每个工作线程组遍历它所负责区间内的所有顶点。当检查顶点V时,如果该顶点V处于未访问状态,则检查它的所有入边,如果找到一个入边的源顶点处于激活态,则将顶点V加入下一层的激活态顶点集和广度优先搜索树,同时结束对顶点V的邻居的检查。
[0025]3.3)当某层处于激活态的顶点数Nf为O时,任务执行结束。
[0026]作为一种优选方案,如果运行机器为NUMA (Non Uniform Memory AccessArchitecture,非统一内存访问)架构,过程2)数据区间划分中的不同区间的数据可以存储到不同NUMA节点的本地内存上去,从而提高数据读取效率。由于每个工作线程组负责一个数据区域,CPUsocket上的工作线程组可将读取的数据存储在离该CPU socket最近的NUMA节点内存上,以提高数据读取效率。
[0027]作为一种优选方案,对于非规则的图数据,在过程3)中,用户可以指定任务执行在自底向上状态使用带有负载均衡策略的自底向上方法。带有负载均衡策略的自底向上方法的工作线程组所负责的数据区间分配方式与普通自底向上方法相同,只是在任务执行时有所差别。任务执行时,每个工作线程组访问完成自己所负责的区间内的所有顶点以后,检查其他工作线程组所负责区间的执行情况。如果发现其他工作线程组未完成自己区间的检查,则从其中获取区间任务片段执行,从而提高负载均衡性。
[0028]与现有技术相比,本发明的有益效果是:
[0029]利用本发明提供的技术方案,可以使得广度优先搜索方法在很小的初始化时间和不改变内存使用量的条件下,更好的感知和利用运行环境的体系结构特点,减少访问冲突,提尚访存效率,进而提尚程序运彳丁速度。
【附图说明】
[0030]图1是本发明进行工作线程分组与绑定过程的流程框图。
[0031]图2是本发明进行任务执行过程的流程框图;
[0032]其中,α、β、γ是用户指定参数;该三个用户指定参数决定方法在各状态间切换的时机,其取值要求满足β *edgefactor> γ ;η为输入图数据的顶点数;Nf表示当前层处于激活态的顶点的数量;edgefactor表示一张图中每个顶点的平均边数;框图中各状态之间的转移条件如下:
[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]下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。
[0044]本发明提供的基于共享内存体系结构的并行广度优先搜索方法包括工作线程分组与绑定过程、数据区间划分过程和任务执行过程。
[0045]图1是本发明进行工作线程分组与绑定过程的流程框图。如图1所示,工作线程分组与绑定过程包括获得CPU拓扑结构、生成工作线程并分组、将工作线程组绑定到CPUsocket上;具体如下:
[0046]I)工作线程分组与绑定过程:
[0047]1.1)主线程获得运行环境的CPU拓扑结构。
[0048]具体实施在Linux环境下,通过从系统文件/proc/cpuinfo中获得机器的CPU拓扑结构,包括CPU的物理核数,逻辑核数,socket数量。
[0049]1.2)生成与CPU逻辑核数相同个数的工作线程,并将它们分为与socket数量相同的工作线程组。假设机器有s个socket和P个逻辑核,则生成P个工作线程,并将它们分为s组,每组s/p个工作线程。
[0050]1.3)根据CPU拓扑结构将不同工作线程组绑定到不同CPU socket上。通过设置工作线程对CPU的亲和性,可以指定工作线程在哪些CPU上执行。对于每个工作线程组,将其分配给一个CPU socket,即指定该工作线程组内的所有工作线程在且只在该socket内的逻辑核上执行。
[0051]2数据区间划分过程:
[0052]将图划分为与执行环境中CPU socket个数相同的的区间,使得每个区间包含图中连续的一部分顶点,并且每个区间内顶点的边数总和近似相同。不同区间没有重复顶点,并且所有区间的并集为原始图数据。假设输入数据有η个顶点,m条边,机器有s个socket,则数据分组方法如下:
[0053]将顶点集合V分为连续的P个子集:V= [Vl|…I Vp],并且依据顶点的分组将边划分为P个连续的子集E = [El I…IEp],其中Ei = [(U,V) V e Vi],即每个边的子集中边的目标顶点属于对应的顶点的子集。对于顶点集V的分组,每个子集的顶点的范围取值满足如下条件,对于任意i,顶点的子集Vi的范围使得边的子集Ei内边的数量尽量接近于m/s。
[0054]数据区间划分完毕后,在任务执行时每个工作线程组负责一个数据区间内的任务。
[0055]作为一种优选方案,如果运行机器为NUMA (Non Uniform Memory AccessArchitecture,非统一内存访问)架构,过程2)数据区间划分中的不同区间的数据可以存储到不同NUMA节点内存上去,从而提高数据读取效率。
[0056]3)任务执行:
[0057]图2是本发明进行任务执行过程的流程框图;其中,α、β、γ是用户指定参数;该三个用户指定参数决定方法在各状态间切换的时机,其取值要求满足β *edgefaCtor> γ ;η为输入图数据的顶点数;Nf表示当前层处于激活态的顶点的数量edgefactor表示一张图中每个顶点的平均边数。任务执行时采用层次化遍历的方法,每层通过检查图数据中的一部分边的信息,将部分顶点从未访问状态转化为下一层的激活态,同时将本层的激活态的顶点转化为已访问状态。任务执行初始时处于串行自顶向下状态,选择串行自顶向下方法,只有根顶点处于激活态,其他顶点处于未访问状态。任务执行过程中,根据运行时状态,自动在串行自顶向下状态,并行自顶向下状态和自底向上状态间切换,具体地:
[0058]当执行状态处于串行自顶向下状态时,状态间切换的方法具体为:
[0059]A.若当前层处于激活态的顶点数Nf小于α,方法保持串行自顶向下状态;
[0060]B.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数N f乘以edgefactor再乘以乘以转换参数β小于图的顶点数η时,方法从串行自顶向下状态切换成并行自顶向下状态;
[0061]C.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以乘以转换参数β大于图的顶点数η时,方法从串行自顶向下状态切换成自底向上状态。
[0062]当执行状态处于并行自顶向下状态时,状态间切换的方法具体为:
[0063]Α.若当前层处于激活态的顶点数Nf小于α,方法从并行自顶向下状态切换成串行自顶向下状态;
[0064]B.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数N f乘以edgefactor再乘以乘以转换参数β大于图的顶点数η时,方法从并行自顶向下状态切换成自底向上状态;
[0065]C.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数N f乘以edgefactor再乘以乘以转换参数α小于图的顶点数η时,方法保持并行自顶向下状
??τ O
[0066]当执行状态处于自底向上状态时,状态间切换的方法具体为:
[0067]Α.若当前层处于激活态的顶点数Nf小于α,方法从自底向上状态切换成串行自顶向下状态;
[0068]B.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数N f乘以edgefactor再乘以转换参数γ小于图中顶点数η,方法从自底向上状态切换成并行自顶向下状态;
[0069]C.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数N f乘以edgefactor再乘以转换参数γ大于图中顶点数η,方法保持自底向上状态。
[0070]串行自顶向下、并行自顶向下和自底向上三种方法输入参数和输出结果均等价,只是执行过程不同,适用于不同情况。具体来讲:
[0071]3.A串行自顶向下方法。当处于激活态的顶点很少时,方法的同步时间和线程通信时间将会大于该层的执行时间。为了避免多于的同步开销和线程通信开销,在处于激活态的顶点很少的层数上,方法使用串行自顶向下方法。该方法主线程并不唤醒各工作线程组,而是亲自检查处于所有激活态的顶点的所有邻居。当被检查的出边找到一个处于未访问状态的邻居时,将该邻居加入下一层的激活态顶点集并且将该邻居加入广度优先搜索树。在该方法中,激活态顶点用数组储存序号表示。
[0072]3.B并行自顶向下方法。在一层遍历中,并行自顶向下方法的每个工作线程组执行一个区间内的任务。对于任意一个工作线程组,组内所有工作线程并行的遍历所有处于激活态的顶点,通常是每个工作线程取激活态的顶点的一个或几个子集检查。对于一个工作线程,当取得一个子集后,将检查该子集内顶点的出边邻居。如果该邻居不属于该工作线程组所负责的区间则跳过;否则工作线程检查该邻居的状态。如果该邻居处于未访问状态,则将该邻居加入下一层的激活态顶点集并且将该邻居加入广度优先搜索树。在该方法中,激活态顶点用数组储存序号表示。
[0073]3.C自底向上方法。在一层遍历中,自底向上方法的每个工作线程组遍历所负责区间内的所有顶点。同一工作线程组内的工作线程并行的遍历所负责区间内的所有顶点,并判断顶点的状态。如果该顶点处于已访问状态或者激活态,则跳过。如果该顶点处于未访问状态,则检查它的所有入边邻居。如果找到一个入边邻居处于激活态,则将该顶点加入下一层激活态和广度优先搜索树,同时结束对该顶点剩余邻居的检查。在该方法中,激活态顶点使用位图方式表示。位图位数为顶点的数量,每一位对应一个顶点。该位为O时表示该顶点不处于激活态,该位为I时表示该顶点属于激活态。
[0074]当某层激活态的顶点数Nf为O时,任务执行结束。
[0075]作为一种优选方案,对于非规则的图数据,在过程3)任务执行中,用户可以指定方法在自底向上状态使用带有负载均衡策略的自底向上方法。带有负载均衡策略的自底向上方法的工作线程组所负责的数据区间分配方式与普通自底向上方法相同,只是在任务执行时有所差别。任务执行时,每个工作线程组访问完成自己所负责的区间内的所有顶点以后,检查其他工作线程组所负责区间的执行情况。如果发现其他工作线程组未完成自己区间的检查,则从其中获取区间任务片段执行,从而提高负载均衡性。
[0076]下面通过实例对本发明做进一步说明。
[0077]本实施例使用一台Dell PowerEdge R820服务器,在一个顶点数为3072441、边数为234370166的社交图数据orkut上,运行以ID为2792870的顶点为根顶点的广度优先搜索方法。orkut是一个社交网站,该数据顶点表示网站用户,边表示网站用户间的好友关系。本发明提供的广度优先搜索方法具体包括如下过程和步骤:
[0078]I)工作线程分组与绑定过程:
[0079]1.1)获得运行环境的CPU拓扑结构。程序通过读取系统文件/proc/cpuinfo得到机器的CPU拓扑结构。/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创建64个工作线程,每16个工作线程分为I组。通过pthread_setaffinity_np O将不同工作线程绑定在不同的socket上,同组工作线程绑定在同一个socket上。以O号工作线程为例,绑定方法如下:
[0081]1.2.1)获得O号逻辑核所在的socket,设为S,并根据CPU拓扑结构获得该socket上所有逻辑核的ID。
[0082]1.2.2)对于O号工作线程的cpuset中的第i位,若逻辑核i在socket s上,贝丨J置I,否则置O。
[0083]1.2.3)利用系统 api pthread_setaff inity_np ()将工作线程 I 的 cpu 亲和性设置为I号工作线程cpuset所代表的亲和性。
[0084]2)数据区间划分:
[0085]运行机器环境有4个socket,则待处理图应该被分为边数相等的4个连续区间,每个区间边数近似相同。对于图orkut,四个区间的起始位置和终止位置分边为顶点O到顶点416767、顶点416768到顶点1202175、顶点1202176到顶点2357247、顶点2357248到顶点3072441,每个区间的边数分别为 58592810 ;58592333 ;58592787 ;58592236。
[0086]任务执行时,每个工作线程组将处理一个区间内的任务,即工作线程组I处理顶点O到顶点416767上的任务、工作线程组2处理顶点416768到顶点1202175上的任务、工作线程组3处理顶点1202176到顶点2357247上的任务、工作线程组4处理顶点2357248到顶点3072441上的任务。
[0087]3)任务执行:
[0088]对于orkut图,方法取参数α = 10,β = 256,γ = 256,方法状态自动切换过程如下:
[0089]初始状态下,处于激活态的顶点为根顶点,方法处于串行自顶向下状态,选择串行自顶向下方法。
[0090]第一层遍历后,处于激活态的顶点共有19个,方法从串行自顶向下状态切换至并行自顶向下状态。
[0091]第二层遍历后,处于激活态的顶点共有2745个,方法从并行自顶向下状态切换到自底向上状态。
[0092]第三层遍历后,处于激活态的顶点共有238638个,方法保持自底向上状态。
[0093]第四层遍历后,处于激活态的顶点共有2245002个,方法保持自底向上状态。
[0094]第五层遍历后,处于激活态的顶点共有582417个,方法保持自底向上状态。
[0095]第六层遍历后,处于激活态的顶点共有3536个,方法从自底向上状态切换到并行自顶向下状态。
[0096]第七层遍历后,处于激活态的顶点共有83个,方法保持并行自顶向下状态。
[0097]第八层遍历后,处于激活态的顶点共有O个,方法执行结束。
[0098]需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
【主权项】
1.一种基于共享内存体系结构的并行广度优先搜索方法,包括工作线程分组与绑定过程、数据区间划分过程和任务执行过程,具体包括如下步骤: 1)工作线程分组与绑定过程,执行如下操作: 1.1)主线程获得计算机运行环境的CPU拓扑结构;所述CPU拓扑结构包括CPU的物理核数、CPU逻辑核数和CPU socket数量; 1.2)主线程生成与CPU逻辑核数相同个数的工作线程,并将工作线程分为与CPUsocket数量相同的工作线程组; 1.3)根据步骤1.1)所述CPU拓扑结构,将每个工作线程组绑定到CPU socket上;工作线程组与CPU socket为——对应关系; 2)数据区间划分过程,执行如下操作: 将原始图数据划分为与步骤1.1)所述CPU socket数量相同的数据区间,使得每个数据区间满足:每个数据区间包含原始图中连续的一部分顶点,并且每个数据区间内顶点的边数总和近似相同;不同数据区间没有重复顶点;所有数据区间的并集为原始图数据; 每个工作线程组负责一个数据区间; 3)任务执行过程,执行如下操作: 3.1)执行初始时,执行状态处于自顶向下状态,除根顶点以外所有顶点处于未访问状态,根顶点处于激活态; 3.2)执行过程中,采用层次化遍历的方法,针对每层,通过检查图数据中的一部分边的信息,从串行自顶向下状态、并行自顶向下状态和自底向上状态中选择一种状态作为执行状态;当处于串行自顶向下状态时,主线程执行串行自顶向下方法,各工作线程组休眠;当处于并行自顶向下状态时,各工作线程组执行并行自顶向下方法;当处于自底向上状态时,各工作线程组执行自底向上方法; 3.3)当某层处于激活态的顶点数为O时,任务执行结束。2.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤1.D所述计算机运行环境为非统一内存访问架构,步骤2)所述数据区间划分中的不同区间的数据可以存储到不同节点内存上,从而提高数据读取效率。3.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤2)所述数据为非规则的图数据,步骤3.2)所述当处于自底向上状态时,各工作线程组执行自底向上方法具体为带有负载均衡策略的自底向上方法,从而提高负载均衡性。4.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤3.2)所述串行自顶向下方法具体为:在每一层遍历中,工作线程组休眠,主线程检查处于所有激活态的顶点的所有邻居;当被检查的出边找到一个处于未访问状态的邻居时,将该邻居加入下一层的激活态顶点集并且将该邻居加入广度优先搜索树。5.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤3.2)所述并行自顶向下方法具体为:在每一层遍历中,每个工作线程组遍历该层中的所有激活态顶点,并且检查该工作线程组所负责区间内的所有出边;当被检查的出边找到一个处于未访问状态的邻居时,将该邻居加入下一层的激活态顶点集并且将该邻居加入广度优先搜索树。6.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤3.2)所述自底向上方法具体为:在每一层遍历中,每个工作线程组遍历它所负责区间内的所有顶点;当检查顶点V时,如果该顶点V处于未访问状态,则检查它的所有入边,如果找到一个入边的源顶点处于激活态,则将顶点V加入下一层的激活态顶点集和广度优先搜索树,同时结束对顶点V的邻居的检查。7.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤3.2)所述从串行自顶向下状态、并行自顶向下状态和自底向上状态中选择一种状态作为执行状态,所述串行自顶向下状态、并行自顶向下状态和自底向上状态之间的切换方法具体为:设定参数α、β和γ,满足β *edgefactor> γ ;设定η为输入图数据的顶点数;设定Nf表示当前层处于激活态的顶点的数量;设定edgefactor表示一张图中每个顶点的平均边数; 当执行状态处于串行自顶向下状态时: A.若当前层处于激活态的顶点数Nf小于α,保持串行自顶向下状态; B.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以乘以转换参数β小于图的顶点数η时,执行状态从串行自顶向下状态切换成并行自顶向下状态; C.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以乘以转换参数β大于图的顶点数η时,执行状态从串行自顶向下状态切换成自底向上状态; 当执行状态处于并行自顶向下状态时,状态间切换的方法具体为: Α.若当前层处于激活态的顶点数Nf小于α,执行状态从并行自顶向下状态切换成串行自顶向下状态; B.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以乘以转换参数β大于图的顶点数η时,执行状态从并行自顶向下状态切换成自底向上状态; C.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以乘以转换参数α小于图的顶点数η时,执行状态保持并行自顶向下状态; 当执行状态处于自底向上状态时,状态间切换的方法具体为: Α.若当前层处于激活态的顶点数Nf小于α,执行状态从自底向上状态切换成串行自顶向下状态; B.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以转换参数γ小于图中顶点数η,执行状态从自底向上状态切换成并行自顶向下状态; C.若当前层处于激活态的顶点数Nf大于α,并且当前层处于激活态的顶点数Nf乘以edgefactor再乘以转换参数γ大于图中顶点数η,执行状态保持自底向上状态。8.如权利要求7所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,所述参数取值为:α = 10,β = 256,γ = 256。9.如权利要求1所述基于共享内存体系结构的并行广度优先搜索方法,其特征是,步骤2)所述原始图数据具体是顶点数为3072441、边数为234370166的orkut社交图数据。
【文档编号】G06F17/30GK106033442SQ201510113383
【公开日】2016年10月19日
【申请日】2015年3月16日
【发明人】余华山, 胡子千, 王娜, 孟佳
【申请人】北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1