一种关于类PLL最短路距离查询算法的并行化加速方法与流程

文档序号:15095832发布日期:2018-08-04 14:32阅读:241来源:国知局

本发明属于计算机网络通信技术领域,具体涉及关于类PLL最短路距离查询算法的并行化加速方法。



背景技术:

图是一种用于抽象描述现实世界中实体间关系的数据结构,在自然科学、工程技术、经济管理以及各种社会问题中都有着广泛的应用。图论,则是以图为研究对象的一个数学分支。最短路查询问题是图论中的一个经典问题,通过查找图内两个顶点的最短路径,以达到最短时间、最少开销、最高效率的目的,在网络通信、路径导航、物流规划、生物医学等许多方面都有着重要应用。因此,设计出更加高效的最短路查询算法一直是图论中一个重要的研究领域。最短路查询的基本经典算法有Dijkstra算法,Ford算法,Floyd算法等。

PLL算法是近年来十分流行的最短路查询算法,在最短路距离查询和路经计算等方面有许多应用,并且该算法通过进一步的变化也可以用于解决带限制最短路查询、K短路等问题,甚至可以应用于动态图的计算。该算法主要过程包含索引构建和询问查询两个阶段,第一阶段的主要过程是以某种次序逐步从每一个结点出发进行搜索剪枝得到该结点到某些结点的最短距离,并将其加入索引;第二阶段是利用最短路的最优子结构的性质,将一段最短路分为两段最短路的形式,通过在索引中进行查询并求和,然后在所有和中取最小值,该最小值即是最终结果。

随着时代的发展,数据规模飞速增长且类型渐趋复杂,传统的最短路查询算法的效率已经难以满足要求,而充分利用CPU的多核特性,研究并行算法是解决该问题的途径之一。

并行计算是将需要计算的问题分解为若干个独立的、可同时进行的子问题,再用多台计算设备同时并行计算这些子问题,能够提高计算的速度与精度,以达到高效地完成计算任务的目的。



技术实现要素:

本发明的目的在于提出一种针对类PLL最短路距离查询算法的并行化加速方法,以使串行特征强烈的类PLL算法高效的并行化实现,提高对计算单元的利用率,并且以此来加速算法的计算过程。

本发明中,类PLL (Pruned Landmark Labeling)算法指的是一种基于搜索剪枝的“构建索引—询问查询”的两阶段算法。

本发明提供的关于类PLL最短路距离查询算法的并行化加速方法,根据硬件特性,结合合理的内存共享、加锁、线程通信等手段,使得原本串行特征强烈的算法也能高效的并行化实现。具体分为如下三个阶段:(一)预处理阶段,根据硬件确定对应线程数目,以充分发挥硬件特性;(二)索引构建阶段,通过共享内存来实现并行化的搜索剪枝;(三)询问查询阶段,合并具有相同端点的询问以减少冗余计算,再并行化处理不同端点的查询。见图1所示。具体步骤如下:

(一)预处理阶段,根据硬件确定对应线程数目,以充分发挥硬件特性;

获取当前处理器的核心数K,读取图的结构并保存在graph中,将结点按照度数由小到大的顺序存放于V中;

显然,所得到的处理器核心数与后续处理过程中的线程数具有直接联系,因此可在充分利用硬件特性的基础上高效的完成并行化操作。

(二)索引构建阶段,通过共享内存来实现并行化的搜索剪枝;

索引LABEL是一个集合{LABEL[v], v∈V},其中LABEL[v] 是一个集合{ LABEL[v][t] =pair<t, dis(v,t)>, t∈V },其中,V={v1,v2, … ,vn} 是图graph的所有点的集合,dis(v,t)是v点到t的最短距离,pair<t, dis(v, t)>是t与 v到t点的距离构成的二元组;索引LABEL的构建过程,开始,根据预处理阶段所获得到的核心数K开启对应数目的线程,从所有未处理结点中挑出优先级最高的对应数目的结点v1,v2, …,vk,并将每个结点作为搜索起点,每个线程处理一个起点,进行搜索操作逐步完成索引的构建,这是一个并行化的过程;

在搜索过程中,线程间共享当前计算好了的索引LABEL,用于搜索过程的剪枝依据;在各个线程结束后,合并新增加的索引到总的索引列表LABEL中,重复执行上述搜索过程,直到所有的结点都被处理完;

显然,所述的并行化搜索过程里的剪枝过程,关于索引LABEL的读取是所有线程共享的,整个过程以核心数为一组,一次并行后更新总索引,再进入下一轮直到所有结点被处理完。

(三)询问查询阶段,合并具有相同端点的询问以减少冗余计算,再并行化处理不同端点的查询;

询问查询阶段开始,先对批量询问进行分析和处理,排序,再通过类似归并的手段将所有询问列表处理成两种类型:具有共同端点的询问组与不具备共同端点的询问组。例如,将具有共同端点的询问组记为:{(A,B1),(A,B2),(A,B3), …} ,其具有共同端点A,不具备共同端点的询问组记为: {(A1, B1), (A2, B2), (A3, B3) …} ;

对于具有共同端点的询问组,先查询共同端点A的索引,即LABEL[A],并保存,再开启对应核心数总数的线程并行化查询所有另一端B1,B2,B3,…的索引,得出最短路的距离;

对于不具有共同端点的询问组,直接开启对应数目的线程进行索引查询,即并行化查询A1与B1, A2与 B2, A3 与B3, …的索引,此时LABEL被所有线程共享,只进行读操作无需加锁。

显然,所述先查询共同端点A点的索引,再通过并行化查询B1, B2, B3, …的索引,这个过程中,索引LABEL是被所有线程共享的,线程数目等于核心数;这样网络中间节点缓存得到优化;

显然,对于不具备共同端点的询问组:{(A1, B1), (A2, B2), (A3, B3) …} ;并行化查询A1与B1, A2与 B2, A3 与B3, …的索引,这个过程中,索引LABEL是被所有线程共享的,线程数目等于核心数。

本发明中,无论是对于索引构建阶段还是询问查询阶段等,其主要的目的都是充分发挥硬件的上的优势,以提高计算速度,因此分配的线程数要与硬件计算单元核心数相匹配。

预处理阶段,其主要利用读取图的结点与边的数据并保存在合适的数据结构中,收集处理器核心数等静态数据为之后的处理做准备。

索引构建阶段,用于构建询问阶段所需要的索引,索引其实质是保存了必要点对以及点对之间的距离,使得在询问阶段,任意两点之间的距离都可以表示为两段(端点-中间结点,中间结点-端点)索引之和。在这一阶段,根据预处理阶段收集到的信息,使用多线程处理,为每个线程分配适当的任务量,并发处理。

询问处理阶段,用于最短距离查询的过程,其过程是根据索引构建阶段的结果,遍历两个端点的索引,找到它们所有的共同索引信息作为中间结点,每找到一个中间结点时,计算两段(起点-中间结点,中间结点-终点)距离之和,最后在所有结果中取出最小值,就是最终答案。在这一阶段,先对批量询问进行处理,划分为不同类型的询问组,再使用多线程过程高效的并发执行查询过程,从而达到提高计算效率的目的。

本发明中,所述中间结点为路由器或者网关代理。

本发明中,索引构造并行示意图如图2所示。

本发明中索引构造阶段,其循环步骤是利用单源点最短路算法获得相应的点对与点对之间的距离,进而总合而成索引。单源点最短路算法主要用于快速计算某点到其他结点的距离,在计算过程中通过合理并且有效的剪枝手段,减少了不必要的计算量。其中,非常重要的对于不同类型的图选取合适的最短路算法,对于无权图,使用较为朴素的广度优先搜索算法加上剪枝就能达到很好的效果;对于带权图,可以将广度优先搜索算法替换为堆优化的Dijkstra算法。

本发明中,在索引构造的并行化过程里,非常重要的内容是将循环计算最短路的过程合理分配给不同的线程去执行,达到并行的实现计算。在剪枝的时候,线程之间共享已经计算好的索引,使得并行过程不影响剪枝效果。在更新索引的时候,当前线程所新计算出的索引信息不直接添加进入总的索引,而是选择保存在自己的副本中,等到一组线程执行完再一起更新到总的索引中,使得单个的计算过程中无需考虑读写加锁问题,减少了开销。实验表明,在开启的线程数与计算核心数匹配的时候,单个线程计算效率与串行算法中同等计算量的计算效率相当,因此在总计算量不变的情况下,平均分配给多个线程并发执行,能达到极佳计算效果。

鉴于合并索引的时候会产生一定的开销,具体的合并手段与次数可以根据具体情况进行调控。在图的结构以多团的形式存在时,计算前期可以提高合并的频率,如此可以增大后期的剪枝效率,其主要原因是因为在预处理阶段采取了将结点按照度大小的顺序进行排序,使得后期剪枝效果更佳。在图的解雇以平均结点度数的分布时,前期剪枝效果并不佳,可以适当减少甚至无需合并索引。因此,根据具体的图结构,我们通过针对不同的情形设定不同的合并模式,从而可以让整个流程更加具有适应性。

本发明中,每个线程通过剪枝搜索得到必要的点对以及点对之间的距离,最终汇总到索引LABEL中。

首先,将预处理阶段获得的数据都保存下来,处理器核心数K,结点数N,边数M,图存储在Graph<V, E>中,V为结点集合,以度由大到小顺序存放,E为边的集合。从V中取出未处理的K结点,分配给K个线程分别作为起点进行搜索过程。

在剪枝的时候,通过如下条件进行判断:

IfQuery(Vi, u, LABEL) <=Dis(Vi, u)

Continue:

End if

其中,Vi是搜索起点,u是当前结点,LABEL是已经计算的索引,Dis(Vi, u)是当前Vi到 u的距离,当从已计算好的索引中可获得的结果比当前计算的结果小的时候,那么当前搜索分枝就可以被剪掉,否则当前结果就加入总的索引中。

以上过程通过多线程反复并发执行,直到所有的结点都被处理过。

本发明中,询问查询并行示意图如图3所示。

本发明中,分组过程主要目的是将具备相同端点的询问分为同一组,因为在具有相同过的点的询问,针对这个端点,只需要查询一次索引,然后保存在内存中,剩下的端点并发查询,这样可以便面冗余计算,减少开销。

本发明中,计算最短路距离时采用的一个特性是最短路径的最优子结构,其数学描述为对于已知的最短路径Path(p,u, u1, …, ui, …, uj, v, q), 它是p到q的最短路径,那么u到v的最短路径就是Path(u, u1, …, ui, …, uj, v).因此对于任意两点之间的最短距离可以通过如下公式进行计算:

Dis(u, v) =min{dis(u, t) + dis(v, t), t ∈ LABEL[u] ∩LABEL[v]}.

其中,LABEL是已经构建好的索引。

本发明中,非常重要的一点是在共享数据时,全力避免了写共享的存在,读共享时无需加锁,使得并发执行的效率得到了极大的保证。

本发明提供的关于类PLL最短路距离查询算法的并行化加速方法,不局限与PLL算法,只要是类似的算法框架,都可以通过该方法完成并行化工作。

附图说明

图1方法整体流程图。

图2是索引构建阶段并行示意图。其中, K为3,同框内并行处理。

图3是询问查询阶段并行示意图。其中,同框内并行处理。

具体实施方式

本发明主要运用在提供最短路距离查询或等相关服务的设备上,要求该设备拥有多核处理计算能力,并且具有一定的存储数据与计算的能力,保证整个流程的计算过程所涉及到的算法可以顺利的在设备当中运行。

在这里,我们假设用户此时需要在一台需要提供最短路距离查询服务的服务器上运行该系统模型,系统程序将直接运行在服务器主机上。假设服务器可使用处理器核心数为3,输入数据将从文件读入,图的结点数为N,边数为M,假设当前图的类型为无向无权图。

步骤(1),获取当前处理器的核心数K( K = 3),读取图的结构并保存在Graph<V, E>中,边将结点按照度数由小到大的顺序存放于V中;

步骤(2),索引LABEL(索引是一个集合{LABEL[v], v∈V},其中LABEL[v] 是一个集合{ LABEL[v][t] =pair<t, dis(v,t)>, t∈V }),此步骤目的是完成LABEL的构建。根据步骤(1)所获得到的核心数K,生成K个线程数,分别处理从v1, v2, …, vk结点为起点的广度优先搜索,得到必要的点对与点对间的距离,将其加入LABEL;

步骤(3),在步骤(2)的搜索过程中,线程间共享当前计算好了的索引LABEL,用于搜索过程的剪枝依据,剪枝的条件是Query(Vi, u, LABEL) <= Dis(Vi, u)。在各个线程结束后,合并新增加的索引到总的索引列表LABEL中,重复执行步骤(2)直到所有的结点都被处理完;

步骤(4),针对询问处理,将询问列表按照字典序排序,再通过归并的手段将所有询问列表划分为两种类型的分组:具有共同端点的询问组与不具备共同端点的询问组。如图3,在此例中产生了两个分组:{(A, B1), (A, B2), (A, B3), …} (具有共同端点A) 和 {(A1, B1), (A2, B2), (A3, B3) …} ;

步骤(5),对于步骤(4)中具有共同端点的询问组,先查询共同端点A的索引即LABEL[A]并保存,这里保存的是端点A到部分结点的距离。再生成对应K个线程并行化查询所有另一端B1, B2, B3, …的索引,每个询问的答案可以通过公式Dis(u, v) =min{dis(u, t) + dis(v, t), t ∈ LABEL[u] ∩ LABEL[v]} 得到;

步骤(6),对于步骤(4)中不具有共同端点的询问组,只需生成对应K个线程依次处理每个询问,每个询问的结果同步骤5)中的方法一致。在这个步骤中,LABEL被所有线程共享,只进行读操作无需加锁。

用户可以把参数N, M, K等设置为外置输入参数,在调用程序时动态输入。此外可增加参数用于表示线程索引副本与总索引的合并模式,用于调控减少合并操作的开销。

根据本实例,本领域内的技术人员可以清楚了解整个算法并行化的方法。本方法主要着眼于在硬件的支持下,使用多线程手段,合理分配任务量,高效完成算法功能。在线程之间的数据共享与通信处理时,尽力避免了写同步加锁的情况,从而减少并行导致的开销。需要注意的是本方法并不对针对本实例而实施,同样具备类似于PLL算法框架的算法流程都可以通过本方法实现并行化。因此,本发明所附权利请求涵盖在本发明的精神范围内的尝试与修改。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1