CN103559016A - 一种基于图形处理器并行计算的频繁子图挖掘方法 - Google Patents
一种基于图形处理器并行计算的频繁子图挖掘方法 Download PDFInfo
- Publication number
- CN103559016A CN103559016A CN201310503214.6A CN201310503214A CN103559016A CN 103559016 A CN103559016 A CN 103559016A CN 201310503214 A CN201310503214 A CN 201310503214A CN 103559016 A CN103559016 A CN 103559016A
- Authority
- CN
- China
- Prior art keywords
- frequent
- limit
- edge
- expansion
- subgraph
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明公开了一种基于图形处理器并行计算的频繁子图挖掘方法,通过GPU划分出各个线程块block,将频繁边均匀分配给不同的线程进行并行处理,通过最右扩展rightmost得到不同的扩展子图,将最后各个线程得到的图挖掘数据集返回给每个线程块block;最后,通过GPU与内存进行数据通信,将结果返回给CPU进行处理。本发明提供了一种可行、有效的图挖掘方法,使得在密集型大数据环境下的图挖掘性能得到优化,提高图挖掘效率,为科研分析、市场研究等提供快速、可靠的数据信息,实现在CUDA统一计算设备架构上的并行挖掘方法。
Description
技术领域
本发明涉及一种基于图形处理器并行计算的频繁子图挖掘方法,以提高图数据挖掘效率。
背景技术
随着数据挖掘领域的不断深入和发展,图数据挖掘越来越受到研究人员的关注,因此图挖掘已经成为数据挖掘和机器学习的新的研究方向。该研究在现实生活中的许多领域都具有巨大的潜在价值,如生物信息学中的蛋白质结构分析、基因组识别,社会网络中实体间的联系,Web分析中Web内容挖掘、Web链接结构分析,文本信息检索等。
目前国内外对图数据挖掘的研究工作主要可分为以下四类:1、图的匹配研究;2、图数据中的关键字查询研究;3、频繁子图挖掘问题研究;4、图的聚类及分类问题研究。频繁子图挖掘作为图数据挖掘领域中的一个重要研究方向,现已存在诸如AGM(Apriori based Graph Mining)、FSG(Frequent SubgraphDiscovery)、gSpan、CloseGraph等经典算法及其改进算法。随着大数据时代的来临,以上算法作为串行算法,让处理器的计算工作量变得非常庞大,使得整个图数据挖掘过程变得“捉襟见肘”,挖掘性能受到一定的抑制。
在单CPU处理器环境下,一般的频繁子图挖掘方法在通过给定的图数据库中找出支持度大于min_sup最小支持度的频繁边,再对频繁边做频繁子图扩展,得到生成图集,最后通过同构验证去除同构的频繁子图结构,得到图数据库中的所有频繁项集。对于这种传统挖掘方法存在几个弊端:其一,挖掘过程需要进行复杂的同构验证,而子图同构问题其实是NP完全问题,其计算复杂且运算量大;其二,挖掘过程中,将进行大量的重复计算,浪费资源;其三,由于数据量庞大,单CPU处理器平台负载过大,CPU内部存储单元不够使用。
图形处理器GPU(Graphics Processing Units)是一种集成了几何变换、光照、三角形构造、裁剪和绘制引擎等功能,并具有每秒至少1千万个多边形的处理能力的单芯片处理器,且具有天然的并行特性。GPU体系结构一般由流处理器阵列和存储器系统两部分组成,其中流处理器阵列又包含若干个线程处理群(Thread Processing Cluster,TPC),每个TPC中包含有2-3个流多处理器(StreamingMultiprocessor,SM),而每个流多处理器又包含8个流处理器(StreamingProcessor,SP),流处理器是用来处理各个线程及线程块运算。因此,GPU是以大量线程实现面向大数据量的并行计算,适合处理计算密度高、逻辑分支简单的大规模数据并行负载。
针对GPU通用计算(General-Purpose computing on the GPU,GPGPU),nVIDIA公司推出了一个全新的软硬件平台----统一计算机设备架构(ComputeUnified Device Architecture)。CUDA可以直接对GPU进行设备管理和并行计算的架构平台,其编程语言是针对GPGPU的C/C++语言,而不需要考虑在图形环境下API的实现方法。
发明内容
本发明的目的在于突破单处理器环境下频繁子图挖掘的瓶颈,提供一种可行、有效的图挖掘方法,使得在密集型大数据环境下的图挖掘性能得到优化,提高图挖掘效率,为科研分析、市场研究等提供快速、可靠的数据信息,实现在CUDA统一计算设备架构上的并行挖掘方法。
为解决上述技术问题,本发明采用以下技术方案:
一种基于图形处理器并行计算的频繁子图挖掘方法,通过GPU划分出各个线程块block,将频繁边均匀分配给不同的线程进行并行处理,通过最右扩展rightmost得到不同的扩展子图,将最后各个线程得到的图挖掘数据集返回给每个线程块block;最后,通过GPU与内存进行数据通信,将结果返回给CPU进行处理。
所述的频繁子图挖掘方法,频繁子图扩展在GPU中的并行过程如下所述:
步骤1:计算图集中所有标号图的边的支持度,根据最小支持度min_sup确定频繁图的片段,将输入图集合中所有的频繁边加入集合rank_edge[]中,并以rank_edge[]中的频繁边作为初始子图;
步骤2:根据集合rank_edge[],GPU同时开辟sum_count个线程,并标号t0,t1...tn,平均每512个线程组成一个block;由各个初始子图做最右扩展,得到的频繁子图;如对k阶频繁子图的最小DFS编码进行最右扩展,每次向最右路添加一条边,得到k+1阶候选子图;其中每一阶候选子图都是其父母节点的超图;
步骤3:重新计算k+1阶候选子图的支持度;对通过最右扩展得到的k+1阶子图计算支持度,如果大于最小支持度min_sup则保存,否则将其删除;
步骤4:剪枝冗余编码;比较第k+1阶候频繁子图的DFS编码,如果扩展得到的k+1阶频繁子图不是最小DFS编码,则认为该图是冗余的,可从候选子图中删除;
步骤5:缩减图集合;当一条频繁边的所有最右扩展全部完成后,可将该频繁边从输入图集合中删除,以缩小输入图集合。
所述的频繁子图挖掘方法,具体执行以下步骤:
(1)首先读取图数据库中数据集data_node[10000]到CPU内存单元graphdata[num]中去,其中graphdata为结构体数组,其结构体成员为一五元组(node_msg,node_lable,edge_x,edge_y,edge_weight),分别表示图中结点信息,结点标号,一条边的两个顶点x、y以及边的权值,num表示图数据库的图数量;
(2)定义两个数组rank_node[lable-max],rank_edge[lable-max]用于对图数据库中不同标号的点和边进行排序,分别存储在rank_node[]和rank_edge[]中;label-max代表每个图集的节点最大的个数,初始化label-max为500;排序后,能够快速找到满足min_sup最小支持度的点边集合;
(3)初始化min_sup的值,对图数据集进行遍历,将所有满足条件min_sup的边存入数组rank_edge[],并对其进行排序和计数,用字典顺序进行排序,用sum_count计数;
(4)在GPU端,根据sum_count频繁边总数,决定开辟线程数目的多少,将数据从cpu端传输到gpu端;
(5)在GPU开辟的两个内存块:stacksource[]和ksource[],其大小均为sum_count*sizeof(Graphdata)*100;两块内存分别用来存储不同数据,stacksource[]用于返回频繁子图结果集,ksource[]则用于进行最右扩展的迭代运算;定义graphdata型变量source,用于存放扩展得到的中间结果,初始化计数变量next的值为source中频繁边的个数,令p=next-1,其值为频繁边在stacksource中的计数并初始化p1=p=0;
(6)在GPU中分配内存后,开始对于每个线程进行并行,tid用于标记线程号,令ksource[tid*100+0]等于每个线程的初始source;
(7)将ksource[]遍历循环,将每个值赋给source使其做接下来的工作;对source中的图数据进行最小dfs编码,将booldfs(source)这个类型的函数设置为gpu端的一个设备状态函数bool_device_dfs(source);
bool_device_dfs(source)函数可初始化为boolf[countnode][countedge]=true,conutedge为source的频繁边总个数,同时定义一个栈edgestack[maxlen],maxlen=10;
(8)如果bool_device_dfs(source)返回值是ture,则把source插入到stacksource[tid*100+k],k代表当前线程中第k个插入到数组中去的,也即对一个结果集计数的过程,同时,p1++;
(9)利用最右扩展,对k阶频繁图而言,任意从一条频繁边开始,判断并比较该边两端x,y的值,若其y值比rm数组中的x值大,则将该y值写入数组rm中,作为最右扩展的扩展边,即找到k阶频繁子图的第k+1条边,然后将找到的所有的结果集用类似map容器存数方式进行存储,并将此函数定义为func;
(10)在这个流程中,核心程序开始在func函数按顺序查找,如果edge{node_msg,node_lable,edge_x,edge_weight,edge_y}中的edge_y>next,next=next+1;这样可以知道扩展是内扩展还是外扩展,内扩展是指扩展的边两端的节点都在原来的图中;外扩展是指扩展的边两端的节点有一端是在图中,另一端是在扩展外部而来;
(11)将GPU端的stacksoruce传递给CPU端的内存,内存大小是:sum_count*sizeof(Graphdata)*100;
(12)对stacksoruce[]进行遍历,将结果集输出到txt文档中,最后得到结果频繁子项集。
所述的频繁子图挖掘方法,所述(3)中,其排序方法如下:有结构体变量edge1、edge2定义为graphdata{node_msg,node_lable,edge_x,edge_y,edge_weight}型变量,其值为egde1{0,4,0,8,7},edge2{2,9,1,6,8};首先比较edge_x,此时(edge1->x)<(edge2->x),则edge1<edge2;如果edeg_x值相等,再比较edge_y,最后比较edge_weight。
所述的频繁子图挖掘方法,所述(4)中,将排好序的频繁边传输到gpu端,在gpu端开辟sum_count*sizeof(edge)大小的显卡内存。
所述的频繁子图挖掘方法,所述(7)中对频繁边的遍历包括以下步骤:
7.1)步骤为先取出遍历的第一条边,进行dfs编码,利用dfs编码进行字典顺序排序;
7.2)若在dfs编码中,存在边edge_x{node_msg,node_msgv,edge_x,edge_y,edge_weight},则标记f[x][y]=false,f[y][x]=false,表明该边已经遍历,无需重复遍历;利用IF(stack[p])来判断stack[p]里面是否是空集,如果是,则dfs遍历完成,返回true值;如果不是,则继续遍历,直到stack[p]为空;
7.3)最后通过while(satck[p])循环进行判断该编码是否为最小的dfs编码,令w=stack[p--];if(w<k)(k为dfs排序的一个设定值)则继续执行;否则,证明这不是一个最小的dfs编码,返回false,继续遍历。
本发明采用GeForceGTX650图形图像处理器,其执行单元频率为4.5GHz,显存容量1024MB,最大数据传输可达80GB/S。在GPU中CUDA架构下,数个线程thread可以组成一个block线程块。在每一个线程块block中,所有thread线程共享一个sharedmemory公共显存;不同线程块block之间的线程thread不能进行共享。由此,我们可以通过开辟多个线程块block来增加thread线程的数目,进而降低线程thread用于存取全局显存globalmemory所消耗的时间,因为在同一个线程块block中,各个thread共享一个sharedmemory。
本发明对频繁子图进行并行挖掘,对图数据集中的每一条频繁边采用并行策略,其并行挖掘总体流程如图2所示。
本发明通过GPU划分出各个线程块block,将频繁边均匀分配给不同的线程进行处理,通过最右扩展rightmost得到不同的扩展子图,将最后各个线程得到的图挖掘数据集返回给每个线程块block。最后,通过GPU与内存进行数据通信,将结果返回给CPU进行处理。
对于CPU+GPU异构协同计算,为进一步提高其数据处理性能,必须考虑到内存的负载均衡和通信成本这两个问题。CUDA框架下block的内存共享机制可以解决GPU内存不足的问题,本发明采用一种字典顺序标号的存储方式,控制线程并行,实现负载分配平衡问题。在整个并行协同计算的过程中,CPU负责复杂逻辑和事务处理等串行运算,其中的某一进程调用GPU工作,通过主存将处理后的数据传送给GPU中的内存单元,进行数据通信。GPU根据数据内容负责线程块的分配和线程的并行运算,本发明通过对频繁边进行迭代进行并行运算。迭代过程中线程根据各频繁边的权值大小判断其优先级,进行负载均衡分配。最后,GPU通过PCIExpress接口在线实时返回并行结果,这一过程充分利用了CPU和GPU的系统资源,实现CPU与GPU异构协同计算。
附图说明
图1:频繁子图并行挖掘示意图;
图2:频繁子图并行挖掘总体流程图;
图3:具体实施方案流程图;
图4:GPU中最右扩展流程;
具体实施方式
以下结合具体实施例,对本发明进行详细说明。
变量定义:
data_node[]图数据集
graphdata[]结构体数组(node_msg图中结点信息,node_lable结点标号,edge_x边顶点x,edge_y边顶点y,edge_weight边权值)
rank_node[] 节点排序数组
rank_edge[] 边排序数组
min_sup 最小支持度
sum_count 记录频繁变总数
stacksource[] 接收返回频繁子图结果集
ksource[] 最右扩展的迭代运算存储
source 存放中间计算值
tid 线程标号
bool_device_dfs(source)设备状态函数,返回dfs是否完成
stack[maxlen]dfs遍历栈
一种基于图形处理器并行计算的频繁子图挖掘方法,其主要流程如图1所示:
1、宿主程序把数据从内存拷贝到GPU外部存储器;
2、核心程序运算,进行频繁子图扩展;
3、宿主程序再把数据从GPU外部存储器拷贝回内存。
本发明采用GeForceGTX650图形图像处理器,其执行单元频率为4.5GHz,显存容量1024MB,最大数据传输可达80GB/S。在GPU中CUDA架构下,数个线程thread可以组成一个block线程块。在每一个线程块block中,所有thread线程共享一个sharedmemory公共显存;不同线程块block之间的线程thread不能进行共享。由此,我们可以通过开辟多个线程块block来增加thread线程的数目,进而降低线程thread用于存取全局显存globalmemory所消耗的时间,因为在同一个线程块block中,各个thread共享一个sharedmemory。
本发明对频繁子图进行并行挖掘,对图数据集中的每一条频繁边采用并行策略,其并行挖掘总体流程如图2所示。本发明通过GPU划分出各个线程块block,将频繁边均匀分配给不同的线程进行处理,通过最右扩展rightmost得到不同的扩展子图,将最后各个线程得到的图挖掘数据集返回给每个线程块block。最后,通过GPU与内存进行数据通信,将结果返回给CPU进行处理。对于CPU+GPU异构协同计算,为进一步提高其数据处理性能,必须考虑到内存的负载均衡和通信成本这两个问题。CUDA框架下block的内存共享机制可以解决GPU内存不足的问题,本发明采用一种字典顺序标号的存储方式,控制线程并行,实现负载分配平衡问题。在整个并行协同计算的过程中,CPU负责复杂逻辑和事务处理等串行运算,其中的某一进程调用GPU工作,通过主存将处理后的数据传送给GPU中的内存单元,进行数据通信。GPU根据数据内容负责线程块的分配和线程的并行运算,本发明通过对频繁边进行迭代进行并行运算。迭代过程中线程根据各频繁边的权值大小判断其优先级,进行负载均衡分配。最后,GPU通过PCIExpress接口在线实时返回并行结果,这一过程充分利用了CPU和GPU的系统资源,实现CPU与GPU异构协同计算。
图3、4具体说明了本发明的详细实施步骤。
(1)如图3所示,首先读取图数据库中数据集data_node[10000]到CPU内存单元graphdata[]中去,其中graphdata为结构体数组,其结构体成员为一五元组(node_msg,node_lable,edge_x,edge_y,edge_weight),分别表示图中结点信息,结点标号,一条边的两个顶点x、y以及边的权值。
(2)定义两个数组rank_node[lable-max],rank_edge[lable-max]用于对图数据库中不同标号的点和边进行排序,分别存储在rank_node[]和rank_edge[]中。label-max代表每个图集的节点最大的个数,初始化label-max为500。排序后,可以快速找到满足min_sup最小支持度的点边集合。
(3)初始化min_sup的值,对图数据集进行遍历,将所有满足条件min_sup的边存入数组rank_edge[],并对其进行排序和计数,用字典顺序进行排序,用sum_count计数。其排序方法如下:
有结构体变量edge1、edge2定义为graphdata{node_msg,node_lable,edge_x,edge_y,edge_weight}型变量,其值为egde1{0,4,0,8,7},edge2{2,9,1,6,8}。
首先比较edge_x,此时(edge1->x)<(edge2->x),则edge1<edge2;如果edeg_x值相等,再比较edge_y,最后比较edge_weight。
(4)在GPU端,根据sum_count频繁边总数,决定开辟线程数目的多少,将数据从cpu端传输到gpu端。
将排好序的频繁边传输到gpu端,在gpu端开辟sum_count*sizeof(edge)大小的显卡内存。此时对rank_edge[]中的频繁边并行扩展,由于频繁边扩展存在频繁图重复出现,为有效利用显存资源,提高并行效率,可以对频繁边进行排序。举例如下:
有g1,g2两个图,g1包含两个边edge1{data1,0,0,edge1,1}和edge2{data2,1,1,edge2,2},若g2恰好与g1相同,min_sup=2,那么当两个线程开始进行并行挖掘时,在线程1中,存在edge1→edge2一个频繁子图,而在线程2中,也存在edge2→edge1的一个频繁子图。因此产生了同构的图结构,为了尽可能的减少重复操作,可以给频繁边设置一个顺序标号,只有当下一个频繁边标号大于当前的频繁边标号时,最右扩展才可以进行。这样在很大程度上减少了同构结构图的产生。
(5)在GPU开辟的两个内存块:stacksource[]和ksource[],其大小均为sum_count*sizeof(Graphdata)*100。两块内存分别用来存储不同数据,stacksource[]用于返回频繁子图结果集,ksource[]则用于进行最右扩展的迭代运算。因此,定义graphdata型变量source,用于存放扩展得到的中间结果,初始化计数变量next的值为source中频繁边的个数,令p=next-1,其值为频繁边在stacksource中的计数并初始化p1=p=0。
(6)在GPU中分配内存后,开始对于每个线程进行并行,tid用于标记线程号,令ksource[tid*100+0]等于每个线程的初始source(频繁边)。
(7)将ksource[]遍历循环,将每个值赋给source使其做接下来的工作。对source中的图数据进行最小dfs编码,将booldfs(source)这个类型的函数设置为gpu端的一个设备状态函数bool_device_dfs(source)。
bool_device_dfs(source)函数可初始化为boolf[countnode][countedge]=true,conutedge为source的频繁边总个数,同时定义一个栈edgestack[maxlen],maxlen=10。
由于GPU对于递归要求比较严格,所以本实施方式避免使用,因此考虑用栈来进行dfs遍历,例如:一个图有两条边,分别为(0,1,edge_weight0)、(1,2,edge_weight1)。首先遍历第一条边,为使遍历能够顺利进行,将边号(0,1,edge_weight0)中的“1“元素存入栈edgestack[maxlen]中,当进行下一条边运算的时候,如果栈顶有元素,就可以直接输出边,进行接下来的遍历;否则,就返回true值,结束dfs遍历。
7.1)上述对频繁边的遍历,步骤为先取出遍历的第一条边,进行dfs编码,利用dfs编码进行字典顺序排序。
7.2)若在dfs编码中,存在边edge_x{node_msg,node_msgv,edge_x,edge_y,edge_weight},则标记f[x][y]=false,f[y][x]=false,表明该边已经遍历,无需重复遍历。利用IF(stack[p])来判断stack[p]里面是否是空集,如果是,则dfs遍历完成,返回true值;如果不是,则继续遍历,直到stack[p]为空。
7.3)最后通过while(satck[p])循环进行判断该编码是否为最小的dfs编码,令w=stack[p--];if(w<k)(k为dfs排序的一个设定值)则继续执行;否则,证明这不是一个最小的dfs编码,返回false,继续遍历。
(8)如果bool_device_dfs(source)返回值是ture,则把source插入到stacksource[tid*100+k],k代表当前线程中第k个插入到数组中去的,也即对一个结果集计数的过程),同时,p1++。
(9)利用最右扩展,如图4所示,对k阶频繁图而言,任意从一条频繁边开始,判断并比较该边两端x,y的值,若其y值比rm数组中的x值大,则将该y值写入数组rm中,作为最右扩展的扩展边,即找到k阶频繁子图的第k+1条边,然后将找到的所有的结果集用类似map容器存数方式进行存储,并将此函数定义为func,采用func存储具有以下优点:
1)可以避免生成重复的边;
2)可以按照顺序生成频繁子图;
3)可以节省显卡内存;
func函数是利用c++中map函数的顺序查找的方式和一一对应的原理进行重写的自写函数,使扩展的边中不存在重复边,并且其扩展过程中所耗内存较小。func函数和map函数数据结构类似,都是采用树状链表方式进行存储。
将插入过来的结点(边元素)与该树的根节点(边元素)进行比较,如果两者相等,则舍去;如果比其边小,则往k阶频繁子图的左子树插入;如果比其边大,则往其右子树插入;如此往复,直到该条边成为一个叶子节点。
9.1)定义一个整型数组rm[next],并将其初始化为rm[next]={-1}。
9.2)开始对source中的每个节点进行循环,令每个节点都和rm数组做起比较{s[i]->iy>s[i]->ix&&s[i]->iy>rm[s[i]->ix]},这样可以保证rm[]数组里面的值均为最右扩展的节点。
9.3)进行树形扩展,并进行dfs编码。
9.4)将扩展的边(func中所存储的边集)按照从小到大的顺序插入到ksource[tid*100+p++]中去,如果p等于p1,则运行完毕返回;否则的话,返回到(7),进行一个循环。如果p不等于p1,说明还有扩展边可能出现频繁子图,这样可以保证频繁子图的完备性。
(10)在这个流程中,核心程序开始在func函数按顺序查找,如果edge{node_msg,node_lable,edge_x,edge_weight,edge_y}中的edge_y>next,next=next+1。这样可以知道扩展是内扩展还是外扩展,内扩展是指扩展的边两端的节点都在原来的图中。外扩展是指扩展的边两端的节点有一端是在图中,另一端是在扩展外部而来。
(11)将GPU端的stacksoruce传递给CPU端的内存,内存大小是:sum_count*sizeof(Graphdata)*100。
(12)对stacksoruce[]进行遍历,将结果集输出到txt文档中,最后得到结果频繁子项集。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
Claims (6)
1.一种基于图形处理器并行计算的频繁子图挖掘方法,其特征在于,通过GPU划分出各个线程块block,将频繁边均匀分配给不同的线程进行并行处理,通过最右扩展rightmost得到不同的扩展子图,将最后各个线程得到的图挖掘数据集返回给每个线程块block;最后,通过GPU与内存进行数据通信,将结果返回给CPU进行处理。
2.根据权利要求1所述的频繁子图挖掘方法,其特征在于,频繁子图扩展在GPU中的并行过程如下所述:
步骤1:计算图集中所有标号图的边的支持度,根据最小支持度min_sup确定频繁图的片段,将输入图集合中所有的频繁边加入集合rank_edge[]中,并以rank_edge[]中的频繁边作为初始子图;
步骤2:根据集合rank_edge[],GPU同时开辟sum_count个线程,并标号t0,t1...tn,平均每512个线程组成一个block;由各个初始子图做最右扩展,得到的频繁子图;如对k阶频繁子图的最小DFS编码进行最右扩展,每次向最右路添加一条边,得到k+1阶候选子图;其中每一阶候选子图都是其父母节点的超图;
步骤3:重新计算k+1阶候选子图的支持度;对通过最右扩展得到的k+1阶子图计算支持度,如果大于最小支持度min_sup则保存,否则将其删除;
步骤4:剪枝冗余编码;比较第k+1阶候频繁子图的DFS编码,如果扩展得到的k+1阶频繁子图不是最小DFS编码,则认为该图是冗余的,可从候选子图中删除;
步骤5:缩减图集合;当一条频繁边的所有最右扩展全部完成后,可将该频繁边从输入图集合中删除,以缩小输入图集合。
3.根据权利要求2所述的频繁子图挖掘方法,其特征在于,具体执行以下步骤:
(1)首先读取图数据库中数据集data_node[10000]到CPU内存单元graphdata[num]中去,其中graphdata为结构体数组,其结构体成员为一五元组(node_msg,node_lable,edge_x,edge_y,edge_weight),分别表示图中结点信息,结点标号,一条边的两个顶点x、y以及边的权值,num表示图数据库的图数量;
(2)定义两个数组rank_node[lable-max],rank_edge[lable-max]用于对图数据库中不同标号的点和边进行排序,分别存储在rank_node[]和rank_edge[]中;label-max代表每个图集的节点最大的个数,初始化label-max为500;排序后,能够快速找到满足min_sup最小支持度的点边集合;
(3)初始化min_sup的值,对图数据集进行遍历,将所有满足条件min_sup的边存入数组rank_edge[],并对其进行排序和计数,用字典顺序进行排序,用sum_count计数;
(4)在GPU端,根据sum_count频繁边总数,决定开辟线程数目的多少,将数据从cpu端传输到gpu端;
(5)在GPU开辟的两个内存块:stacksource[]和ksource[],其大小均为sum_count*sizeof(Graphdata)*100;两块内存分别用来存储不同数据,stacksource[]用于返回频繁子图结果集,ksource[]则用于进行最右扩展的迭代运算;定义graphdata型变量source,用于存放扩展得到的中间结果,初始化计数变量next的值为source中频繁边的个数,令p=next-1,其值为频繁边在stacksource中的计数并初始化p1=p=0;
(6)在GPU中分配内存后,开始对于每个线程进行并行,tid用于标记线程号,令ksource[tid*100+0]等于每个线程的初始source;
(7)将ksource[]遍历循环,将每个值赋给source使其做接下来的工作;对source中的图数据进行最小dfs编码,将booldfs(source)这个类型的函数设置为gpu端的一个设备状态函数bool_device_dfs(source);
bool_device_dfs(source)函数可初始化为boolf[countnode][countedge]=true,conutedge为source的频繁边总个数,同时定义一个栈edgestack[maxlen],maxlen=10;
(8)如果bool_device_dfs(source)返回值是ture,则把source插入到stacksource[tid*100+k],k代表当前线程中第k个插入到数组中去的,也即对一个结果集计数的过程,同时,p1++;
(9)利用最右扩展,对k阶频繁图而言,任意从一条频繁边开始,判断并比较该边两端x,y的值,若其y值比rm数组中的x值大,则将该y值写入数组rm中,作为最右扩展的扩展边,即找到k阶频繁子图的第k+1条边,然后将找到的所有的结果集用类似map容器存数方式进行存储,并将此函数定义为func;
(10)在这个流程中,核心程序开始在func函数按顺序查找,如果edge{node_msg,node_lable,edge_x,edge_weight,edge_y}中的edge_y>next,next=next+1;这样可以知道扩展是内扩展还是外扩展,内扩展是指扩展的边两端的节点都在原来的图中;外扩展是指扩展的边两端的节点有一端是在图中,另一端是在扩展外部而来;
(11)将GPU端的stacksoruce传递给CPU端的内存,内存大小是:sum_count*sizeof(Graphdata)*100;
(12)对stacksoruce[]进行遍历,将结果集输出到txt文档中,最后得到结果频繁子项集。
4.根据权利要求3所述的频繁子图挖掘方法,其特征在于,所述(3)中,其排序方法如下:有结构体变量edge1、edge2定义为graphdata{node_msg,node_lable,edge_x,edge_y,edge_weight}型变量,其值为egde1{0,4,0,8,7},edge2{2,9,1,6,8};首先比较edge_x,此时(edge1->x)<(edge2->x),则edge1<edge2;如果edeg_x值相等,再比较edge_y,最后比较edge_weight。
5.根据权利要求3所述的频繁子图挖掘方法,其特征在于,所述(4)中,将排好序的频繁边传输到gpu端,在gpu端开辟sum_count*sizeof(edge)大小的显卡内存。
6.根据权利要求3所述的频繁子图挖掘方法,其特征在于,所述(7)中对频繁边的遍历包括以下步骤:
7.1)步骤为先取出遍历的第一条边,进行dfs编码,利用dfs编码进行字典顺序排序;
7.2)若在dfs编码中,存在边edge_x{node_msg,node_msgv,edge_x,edge_y,edge_weight},则标记f[x][y]=false,f[y][x]=false,表明该边已经遍历,无需重复遍历;利用IF(stack[p])来判断stack[p]里面是否是空集,如果是,则dfs遍历完成,返回true值;如果不是,则继续遍历,直到stack[p]为空;
7.3)最后通过while(satck[p])循环进行判断该编码是否为最小的dfs编码,令w=stack[p--];if(w<k)(k为dfs排序的一个设定值)则继续执行;否则,证明这不是一个最小的dfs编码,返回false,继续遍历。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310503214.6A CN103559016B (zh) | 2013-10-23 | 2013-10-23 | 一种基于图形处理器并行计算的频繁子图挖掘方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310503214.6A CN103559016B (zh) | 2013-10-23 | 2013-10-23 | 一种基于图形处理器并行计算的频繁子图挖掘方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103559016A true CN103559016A (zh) | 2014-02-05 |
CN103559016B CN103559016B (zh) | 2016-09-07 |
Family
ID=50013273
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310503214.6A Active CN103559016B (zh) | 2013-10-23 | 2013-10-23 | 一种基于图形处理器并行计算的频繁子图挖掘方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103559016B (zh) |
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103995690A (zh) * | 2014-04-25 | 2014-08-20 | 清华大学深圳研究生院 | 一种基于gpu的并行时间序列挖掘方法 |
CN104102476A (zh) * | 2014-08-04 | 2014-10-15 | 浪潮(北京)电子信息产业有限公司 | 非规则流中高维数据流典型相关性并行计算方法及装置 |
CN104952032A (zh) * | 2015-06-19 | 2015-09-30 | 清华大学 | 图的处理方法、装置以及栅格化表示及存储方法 |
CN105808779A (zh) * | 2016-03-30 | 2016-07-27 | 北京大学 | 基于剪枝的图漫游并行计算方法和应用 |
CN106414860A (zh) * | 2016-03-28 | 2017-02-15 | 株式会社小松制作所 | 评价装置以及评价方法 |
CN106446161A (zh) * | 2016-09-23 | 2017-02-22 | 中山大学 | 一种使用Hadoop的极大频繁子图挖掘方法 |
CN106777065A (zh) * | 2016-12-12 | 2017-05-31 | 郑州云海信息技术有限公司 | 一种频繁子图挖掘的方法及系统 |
CN108520027A (zh) * | 2018-03-20 | 2018-09-11 | 大连理工大学 | 一种基于cuda框架的gpu加速的频繁项集挖掘算法 |
CN109508739A (zh) * | 2018-11-02 | 2019-03-22 | 中国空间技术研究院 | 一种基于频繁模式挖掘的典型设计活动预测方法 |
CN109684418A (zh) * | 2018-11-22 | 2019-04-26 | 全球能源互联网研究院有限公司 | 基于电网图数据库的数据存储方法及装置 |
CN109710314A (zh) * | 2018-12-20 | 2019-05-03 | 四川新网银行股份有限公司 | 一种基于图结构分布式并行模式构建图的方法 |
CN109861858A (zh) * | 2019-01-28 | 2019-06-07 | 北京大学 | 微服务系统根因节点的错误排查方法 |
CN110175172A (zh) * | 2019-05-22 | 2019-08-27 | 深圳大学 | 基于稀疏二分图的极大二分团并行枚举方法 |
CN111259205A (zh) * | 2020-01-15 | 2020-06-09 | 北京百度网讯科技有限公司 | 一种图数据库遍历方法、装置、设备及存储介质 |
CN111292223A (zh) * | 2020-01-22 | 2020-06-16 | 北京百度网讯科技有限公司 | 图计算的处理方法、装置、电子设备及存储介质 |
CN111831861A (zh) * | 2020-07-15 | 2020-10-27 | 中兴飞流信息科技有限公司 | 一种大数据领域使用gpu实现多分组数据排序的方法 |
CN111832714A (zh) * | 2019-04-19 | 2020-10-27 | 上海寒武纪信息科技有限公司 | 运算方法及装置 |
CN111984833A (zh) * | 2020-05-18 | 2020-11-24 | 中科院计算所西部高等技术研究院 | 基于gpu的高性能图挖掘方法及系统 |
CN114816680A (zh) * | 2022-03-09 | 2022-07-29 | 华北电力大学 | 一种基于cpu-gpu架构的业务流程模型发现方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102096719A (zh) * | 2011-02-18 | 2011-06-15 | 中国科学院计算技术研究所 | 一种基于图的存储模式挖掘方法 |
JP2011197846A (ja) * | 2010-03-18 | 2011-10-06 | Fujitsu Ltd | 情報処理装置、並列計算制御方法、プログラム及び並列計算システム |
-
2013
- 2013-10-23 CN CN201310503214.6A patent/CN103559016B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2011197846A (ja) * | 2010-03-18 | 2011-10-06 | Fujitsu Ltd | 情報処理装置、並列計算制御方法、プログラム及び並列計算システム |
CN102096719A (zh) * | 2011-02-18 | 2011-06-15 | 中国科学院计算技术研究所 | 一种基于图的存储模式挖掘方法 |
Non-Patent Citations (2)
Title |
---|
白洪涛等: "一种基于图形处理器的频繁模式挖掘算法", 《仪器仪表学报》 * |
胡健等: "挖掘不确定频繁子图的改进算法的研究", 《计算机工程与应用》 * |
Cited By (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103995690A (zh) * | 2014-04-25 | 2014-08-20 | 清华大学深圳研究生院 | 一种基于gpu的并行时间序列挖掘方法 |
CN103995690B (zh) * | 2014-04-25 | 2016-08-17 | 清华大学深圳研究生院 | 一种基于gpu的并行时间序列挖掘方法 |
CN104102476A (zh) * | 2014-08-04 | 2014-10-15 | 浪潮(北京)电子信息产业有限公司 | 非规则流中高维数据流典型相关性并行计算方法及装置 |
CN104952032B (zh) * | 2015-06-19 | 2018-03-23 | 清华大学 | 图的处理方法、装置以及栅格化表示及存储方法 |
CN104952032A (zh) * | 2015-06-19 | 2015-09-30 | 清华大学 | 图的处理方法、装置以及栅格化表示及存储方法 |
US10147339B2 (en) | 2016-03-28 | 2018-12-04 | Komatsu Ltd. | Evaluation apparatus and evaluation method |
CN106414860B (zh) * | 2016-03-28 | 2019-04-26 | 株式会社小松制作所 | 评价装置以及评价方法 |
CN106414860A (zh) * | 2016-03-28 | 2017-02-15 | 株式会社小松制作所 | 评价装置以及评价方法 |
CN105808779A (zh) * | 2016-03-30 | 2016-07-27 | 北京大学 | 基于剪枝的图漫游并行计算方法和应用 |
CN106446161A (zh) * | 2016-09-23 | 2017-02-22 | 中山大学 | 一种使用Hadoop的极大频繁子图挖掘方法 |
CN106446161B (zh) * | 2016-09-23 | 2019-10-01 | 中山大学 | 一种使用Hadoop的极大频繁子图挖掘方法 |
CN106777065A (zh) * | 2016-12-12 | 2017-05-31 | 郑州云海信息技术有限公司 | 一种频繁子图挖掘的方法及系统 |
CN108520027A (zh) * | 2018-03-20 | 2018-09-11 | 大连理工大学 | 一种基于cuda框架的gpu加速的频繁项集挖掘算法 |
CN108520027B (zh) * | 2018-03-20 | 2020-09-29 | 大连理工大学 | 一种基于cuda框架的gpu加速的频繁项集挖掘方法 |
CN109508739A (zh) * | 2018-11-02 | 2019-03-22 | 中国空间技术研究院 | 一种基于频繁模式挖掘的典型设计活动预测方法 |
CN109684418A (zh) * | 2018-11-22 | 2019-04-26 | 全球能源互联网研究院有限公司 | 基于电网图数据库的数据存储方法及装置 |
CN109710314A (zh) * | 2018-12-20 | 2019-05-03 | 四川新网银行股份有限公司 | 一种基于图结构分布式并行模式构建图的方法 |
CN109861858A (zh) * | 2019-01-28 | 2019-06-07 | 北京大学 | 微服务系统根因节点的错误排查方法 |
CN109861858B (zh) * | 2019-01-28 | 2020-06-26 | 北京大学 | 微服务系统根因节点的错误排查方法 |
CN111832714B (zh) * | 2019-04-19 | 2023-11-17 | 上海寒武纪信息科技有限公司 | 运算方法及装置 |
CN111832714A (zh) * | 2019-04-19 | 2020-10-27 | 上海寒武纪信息科技有限公司 | 运算方法及装置 |
CN110175172A (zh) * | 2019-05-22 | 2019-08-27 | 深圳大学 | 基于稀疏二分图的极大二分团并行枚举方法 |
CN110175172B (zh) * | 2019-05-22 | 2021-08-31 | 深圳大学 | 基于稀疏二分图的极大二分团并行枚举方法 |
CN111259205B (zh) * | 2020-01-15 | 2023-10-20 | 北京百度网讯科技有限公司 | 一种图数据库遍历方法、装置、设备及存储介质 |
CN111259205A (zh) * | 2020-01-15 | 2020-06-09 | 北京百度网讯科技有限公司 | 一种图数据库遍历方法、装置、设备及存储介质 |
CN111292223A (zh) * | 2020-01-22 | 2020-06-16 | 北京百度网讯科技有限公司 | 图计算的处理方法、装置、电子设备及存储介质 |
CN111292223B (zh) * | 2020-01-22 | 2023-07-25 | 北京百度网讯科技有限公司 | 图计算的处理方法、装置、电子设备及存储介质 |
US11941055B2 (en) | 2020-01-22 | 2024-03-26 | Beijing Baidu Netcom Science And Technology Co., Ltd. | Method and apparatus for graph computing, electronic device and storage medium |
CN111984833A (zh) * | 2020-05-18 | 2020-11-24 | 中科院计算所西部高等技术研究院 | 基于gpu的高性能图挖掘方法及系统 |
CN111984833B (zh) * | 2020-05-18 | 2023-08-01 | 中科院计算所西部高等技术研究院 | 基于gpu的高性能图挖掘方法及系统 |
CN111831861A (zh) * | 2020-07-15 | 2020-10-27 | 中兴飞流信息科技有限公司 | 一种大数据领域使用gpu实现多分组数据排序的方法 |
CN114816680A (zh) * | 2022-03-09 | 2022-07-29 | 华北电力大学 | 一种基于cpu-gpu架构的业务流程模型发现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103559016B (zh) | 2016-09-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103559016B (zh) | 一种基于图形处理器并行计算的频繁子图挖掘方法 | |
Lieberman et al. | A fast similarity join algorithm using graphics processing units | |
Pan et al. | Fast GPU-based locality sensitive hashing for k-nearest neighbor computation | |
US8959138B2 (en) | Distributed data scalable adaptive map-reduce framework | |
Yu et al. | A space and time efficient algorithm for SimRank computation | |
Lakhotia et al. | Accelerating {PageRank} using {Partition-Centric} Processing | |
Yuan et al. | PathGraph: A path centric graph processing system | |
Date et al. | Collaborative (cpu+ gpu) algorithms for triangle counting and truss decomposition on the minsky architecture: Static graph challenge: Subgraph isomorphism | |
CN102737126A (zh) | 云计算环境下的分类规则挖掘方法 | |
Zhu et al. | A classification algorithm of CART decision tree based on MapReduce attribute weights | |
He et al. | Efficient parallel A* search on multi-GPU system | |
Chimani et al. | Algorithm engineering: Concepts and practice | |
Yang et al. | An improved cop-kmeans clustering for solving constraint violation based on mapreduce framework | |
Mittal | A survey on applications and architectural-optimizations of micron’s automata processor | |
Li et al. | A single-scan algorithm for mining sequential patterns from data streams | |
Blelloch et al. | The read-only semi-external model | |
Song et al. | Community detection using parallel genetic algorithms | |
Boinski et al. | Algorithms for spatial collocation pattern mining in a limited memory environment: a summary of results | |
Werner et al. | Automated composition and execution of hardware-accelerated operator graphs | |
Xu et al. | Evaluation and trade-offs of graph processing for cloud services | |
Xu et al. | GraphCP: an I/O-efficient concurrent graph processing framework | |
Rochd et al. | An Efficient Distributed Frequent Itemset Mining Algorithm Based on Spark for Big Data. | |
Zhang et al. | An efficient algorithm for extracting high-utility hierarchical sequential patterns | |
Ajwani et al. | Design and engineering of external memory traversal algorithms for general graphs | |
CN117010991B (zh) | 基于gpu并行改进遗传算法的高利润商品组合挖掘方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |