[发明专利]一种GPU上基于内存统一管理的MapReduce实现方法有效
| 申请号: | 201310710435.0 | 申请日: | 2013-12-20 |
| 公开(公告)号: | CN103714009A | 公开(公告)日: | 2014-04-09 |
| 发明(设计)人: | 金海;郑然;刘凯;章勤;冯晓文 | 申请(专利权)人: | 华中科技大学 |
| 主分类号: | G06F12/02 | 分类号: | G06F12/02;G06F17/30 |
| 代理公司: | 华中科技大学专利中心 42201 | 代理人: | 朱仁玲 |
| 地址: | 430074 湖北*** | 国省代码: | 湖北;42 |
| 权利要求书: | 查看更多 | 说明书: | 查看更多 |
| 摘要: | |||
| 搜索关键词: | 一种 gpu 基于 内存 统一管理 mapreduce 实现 方法 | ||
1.一种GPU上基于内存统一管理的MapReduce实现方法,其特征在于,包括以下步骤:
(1)初始化GPU中块的数量Bs、每个块中的线程数目N、以及用户的输入数据量大小M;
(2)为每个块在全局内存上分配中间数据缓冲区,对map计算生成的键值对进行连续的归约操作,通过在键值对的值中设置归约次数和在计算中不断累计,统计键值对出现的频率信息,并根据出现频率对键值对进行排序,提取出高频的键值对;
(3)将步骤(2)得到的高频键值对插入到共享内存中,在任务处理中,通过使用标记数组对全局内存和共享内存的分配进行统一管理,且只有当共享内存资源使用完毕之后,才开始在全局内存中分配空间。
2.根据权利要求1所述的MapReduce实现方法,其特征在于,块的数量Bs的取值范围是1至30,线程数量N的取值范围是32至512。
3.根据权利要求1所述的MapReduce实现方法,其特征在于,步骤(2)包括以下子步骤:
(2-1)在全局内存上为GPU的每个块分配大小为gm_size的中间数据缓冲区,同时分配一个大小为global_size的全局结果缓冲区和大小为num_sort的排序结果缓冲区sort_index[],中间数据缓冲区和全局结果缓冲区中均包括索引数组buckets[]、内存分配区gm_pool[];
(2-2)在共享内存上设置针对全局结果缓冲区内存分配的偏移数组global_offset[]和针对中间数据缓冲区内存分配的偏移数组gm_offset[];
(2-3)初始化GPU的线程号tid、块号bid、总线程数num_threads=Bs*N,将每个块中的线程进行分组,并获取线程分组的数目num_groups= num_threads/32,线程分组号gid=tid/32,偏移数组global_offset[]中每个线程分组的起始内存分配地址global_object_offset[gid]=global_size*(gid+num_groups*bid)/(num_groups*Bs),以及偏移数组gm_offset[]中每个线程分组的起始内存分配地址gm_offset[gid]=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个键值对在偏移数组global_offset[]中对应的值保存在排序结果缓冲区sort_index[]中。
4.根据权利要求3所述的MapReduce实现方法,其特征在于,步骤(2-12)中,所有键值对中出现频率最高的5%-10%的键值对是高频率的键 值对。
5.根据权利要求1所述的MapReduce实现方法,其特征在于,步骤(3)包括以下子步骤:
(3-1)重新初始化GPU每个块对应的中间数据缓冲区中索引数组buckets[]和内存分配区gm_pool[]的所有元素为零,并在中间数据缓冲区中设置内存分配标记数组mem_flag[];
(3-2)在共享内存中建立内存分配区sm_pool[],初始化内存分配区sm_pool[]的偏移地址sm_offset=0,内存分配区sm_pool[]的内存占满标记sm_flag=0;
(3-3)设置计数器i=tid;
(3-4)判断i是否小于H,若是则转入步骤(3-5),否则转入步骤(3-8);
(3-5)取出排序结果缓冲区sort_index[i]对应的键值对,并将该键值对中的归约次数初始化为0;
(3-6)将步骤(3-5)得到的键值对存放在共享内存的内存分配区sm_pool[]中,,将该键值对的偏移地址填入索引数组buckets[]中,并在内存分配标记数组mem_flag[]中分配空间,并填入标记1;
(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[k]是否为1,若是则转入步骤(3-14),否则转入步骤(3-15);
(3-14)从内存分配区sm_pool[]中取出查找到的键值对,然后转入步骤(3-16);
(3-15)从内存分配区gm_pool[]中取出查找到的键值对;
(3-16)对中间数据缓冲区中的键值对和步骤(3-11)生成的键值对执行reduce计算;
(3-17)判断内存占满标记sm_flag是否为0,若是则转入步骤(3-18),否则转入步骤(3-21);
(3-18)在内存分配区sm_pool[]中划分新的空间,用于存放生成的键值对,将该键值对的偏移地址写入索引数组buckets[]中,并在内存分配标记数组mem_flag[]中分配空间,并填入标记1;
(3-19)判断内存分配区sm_pool[]的空间是否占满,若是则转入步骤(3-20),否则转入步骤(3-22);
(3-20)设置sm_flag=1,然后转入步骤(3-22);
(3-21)在内存分配区gm_pool[]中划分新的空间,用于存放生成的键值对,将该键值对的偏移地址写入索引数组buckets[]中,并在内存分配标记数组mem_flag[]中分配空间,并填入标记0;
(3-22)设置i=i+num_threads,然后返回步骤(3-10);
(3-23)GPU的所有线程进行同步操作,并将所有块对应的中间数据缓冲区的键值对合并到全局结果缓冲区。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华中科技大学,未经华中科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310710435.0/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种翻背带机的翻背带机构
- 下一篇:冷却器用的液压胀管机





