一种GPU上基于内存统一管理的MapReduce实现方法技术

技术编号:9906907 阅读:278 留言:0更新日期:2014-04-11 05:49
本发明专利技术公开了一种GPU上基于内存统一管理的MapReduce实现方法,包括:初始化GPU的块大小为Bs,每个块中的线程数目N,输入数据量大小M;在全局内存上为GPU的每个块分配一个中间数据缓冲区,同时分配一个全局结果缓冲区;对p%的输入数据进行预处理,在中间数据缓冲区中收集map任务计算结果和归约频率信息;根据键值对的归约频率,对中间结果进行排序,保存键值对索引信息到排序结果缓冲区sort_index[]中;初始化GPU每个块对应的中间数据缓冲区为零,在共享内存中建立内存分配区sm_pool[];设置内存分配标记数组mem_flag[]。本发明专利技术在每个GPU块的中间数据缓冲区中,对全局内存和共享内存资源进行统一管理,减少了内存资源开销,避免了分开管理导致的键值对对重复查找和map任务重复计算开销。

【技术实现步骤摘要】
【专利摘要】本专利技术公开了,包括:初始化GPU的块大小为Bs,每个块中的线程数目N,输入数据量大小M;在全局内存上为GPU的每个块分配一个中间数据缓冲区,同时分配一个全局结果缓冲区;对p%的输入数据进行预处理,在中间数据缓冲区中收集map任务计算结果和归约频率信息;根据键值对的归约频率,对中间结果进行排序,保存键值对索引信息到排序结果缓冲区sort_index;设置内存分配标记数组mem_flag[]。本专利技术在每个GPU块的中间数据缓冲区中,对全局内存和共享内存资源进行统一管理,减少了内存资源开销,避免了分开管理导致的键值对对重复查找和map任务重复计算开销。【专利说明】—种GPU上基于内存统一管理的MapReduce实现方法
本专利技术属于计算机高性能计算领域,更具体地,涉及。
技术介绍
近年来,随着并行计算的发展,传统上只用于处理图形渲染计算任务的GPU逐渐被用于通用计算领域。相对于CPU,GPU在大规模数据并行处理方面具有强大的优势且性价比较高,可以弥补CPU性能不足的应用场景。为了充分利用GPU这种众核处理器的性能,需要编写适合其体系结构的并行程序。而GPU的硬件结构和传统多核CPU差别较大,内存层次比CPU复杂,且使用便签式存储器(Scratchpad Memory,简称SPM)这类不同于CPU上Cache机制的硬件设计,导致GPU编程与传统的串行编程有较大的区别,具有一定编程难度。为了解决这个问题,学术界提出将分布式计算中的MapReduce编程模型移植到GPU,以简化编程方式。MapReduce只向上层应用开发提供简单的接口,而将与应用本身关系不大的细节实现隐藏在框架之内,这样的编程模型设计极大的提高了并行编程的效率。目前,GPU上的MapReduce编程模型的实现采用两层哈希表结构:在GPU每个块的共享内存中分别设置一个哈希表,在全局内存中设置一个全局哈希表。这个框架局限于处理不同的键值比较少的情况,当不同的键增多后时间开销急剧上升。另外,现有方案在全局内存和共享内存中设置独立的缓冲区,在内存资源的管理上存在内存空间浪费的问题,并在键值对的检索上存在重复查找的问题。
技术实现思路
针对现有技术的以上缺陷或改进需求,本专利技术提供了,其目的在于,解决现有MapReduce编程模型的实现过程中的内存空间浪费和键值对检索上的重复查找的技术问题,且GPU线程的并发度更高,线程间的同步开销更小,具有更好的扩展性。为实现上述目的,按照本专利技术的一个方面,提供了,包括以下步骤:(I)初始化GPU中块的数量Bs、每个块中的线程数目N、以及用户的输入数据量大小M ;(2)为每个块在全局内存上分配中间数据缓冲区,对map计算生成的键值对进行连续的归约操作,通过在键值对的值中设置归约次数和在计算中不断累计,统计键值对出现的频率信息,并根据出现频率对键值对进行排序,提取出高频的键值对;(3)将步骤(2)得到的高频键值对插入到共享内存中,在任务处理中,通过使用标记数组对全局内存和共享内存的分配进行统一管理,且只有当共享内存资源使用完毕之后,才开始在全局内存中分配空间。优选地,块的数量Bs的取值范围是I至30,线程数量N的取值范围是32至512。优选地,步骤(2)包括以下子步骤:(2-1)在全局内存上为GPU的每个块分配大小为gm_size的中间数据缓冲区,同时分配一个大小为global_size的全局结果缓冲区和大小为num_sort的排序结果缓冲区sort_index、内存分配区 gm_pool[];(2-2)在共享内存上设置针对全局结果缓冲区内存分配的偏移数组global_offset;(2-3)初始化GPU的线程号tid、块号bid、总线程数num_threads=Bs*N,将每个块中的线程进行分组,并获取线程分组的数目num_groups=num_threads/32,线程分组号gid=tid/32,偏移数组global_offset 口中每个线程分组的起始内存分配地址global_ob ject_off set =global_size氺(gid+num_groups氺bid) / (num_groups*Bs),以及偏移数组gm_offset口中每个线程分组的起始内存分配地址gm_offset=gm_size*gid/num_groups ;(2-4)设置计数器 i=bid*N+tid ;(2-5)判断i是否小于M*p%,若是则转入步骤(2-6),否则转入步骤(2-11);(2-6)每个线程分别取出输入数据中的第i条记录,并对第i条记录执行map计算,以生成键值对;`(2-7)每个线程在对应的中间数据缓冲区中查找是否已经存在与步骤(2-6)相同键值的键值对,若是则转入步骤(2-8),否则转入步骤(2-9);(2-8)对中间数据缓冲区中的键值对和步骤(2-6)生成的键值对执行reduce计算,并在键值对的值中累计归约次数;(2-9)在块号bid对应的中间数据缓冲区中的内存分配区gm_pool 口中分配新的全局内存空间,用于存放步骤(2-6)生成的键值对,在该键值对的值中初始化归约次数为1,并将该键值对的偏移地址填入索引数组buckets^中;(2-10)设置 i=i+num_threads ;然后返回步骤(2-5);(2-11)所有线程进行同步操作,并将所有块对应的中间数据缓冲区的键值对合并到全局结果缓冲区;(2-12)从全局结果缓冲区中的键值对中提取出现频率较高的键值对,获取该键值对的数量H,并将H个键值对在偏移数组gl0bal_0ffset中;。优选地,步骤(2-12)中,所有键值对中出现频率最高的5%_10%的键值对是高频率的键值对。优选地,步骤(3)包括以下子步骤:(3-1)重新初始化GPU每个块对应的中间数据缓冲区中索引数组buckets的所有元素为零,并在中间数据缓冲区中设置内存分配标记数组mem_flag[];(3-2)在共享内存中建立内存分配区sm_pool □,初始化内存分配区sm_pool(3-3)设置计数器 i=tid;(3-4)判断i是否小于H,若是则转入步骤(3-5),否则转入步骤(3-8);(3-5)取出排序结果缓冲区sort_index对应的键值对,并将该键值对中的归约次数初始化为O ;(3-6)将步骤(3-5)得到的键值对存放在共享内存的内存分配区sm_p00l中,并在内存分配标记数组mem_flag[]中分配空间,并填入标记I ;(3-7)设置i=i+Bs,然后返回步骤(3-4);(3-8) GPU的所有线程进行同步操作;(3-9)设置 i=tid+M*p% ;(3-10)判断i是否小于M,若是则转入步骤(3-11),否则转入步骤(3-21);(3-11)每个线程分别取出输入数据中的第i条记录,并对第i条记录执行map计算,以生成键值对;(3-12)每个线程在对应的中间数据缓冲区中查找是否已经存在与步骤(3-11)相同键值的键值对,若是则转入步骤(3-13),否则转入步骤(3-17);(3-13)获取查找到的键值对的下标k,判断mem_flag是否为1,若是则转入步骤(3-14),否则转入步骤(3-15);(3-14)从内存分配区sm_p00l 口中取出查本文档来自技高网
...

【技术保护点】
一种GPU上基于内存统一管理的MapReduce实现方法,其特征在于,包括以下步骤:?(1)初始化GPU中块的数量Bs、每个块中的线程数目N、以及用户的输入数据量大小M;?(2)为每个块在全局内存上分配中间数据缓冲区,对map计算生成的键值对进行连续的归约操作,通过在键值对的值中设置归约次数和在计算中不断累计,统计键值对出现的频率信息,并根据出现频率对键值对进行排序,提取出高频的键值对;?(3)将步骤(2)得到的高频键值对插入到共享内存中,在任务处理中,通过使用标记数组对全局内存和共享内存的分配进行统一管理,且只有当共享内存资源使用完毕之后,才开始在全局内存中分配空间。

【技术特征摘要】

【专利技术属性】
技术研发人员:金海郑然刘凯章勤冯晓文
申请(专利权)人:华中科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1