如何实现网络共享任务共享

Tower.im – 简单,好用的团队协作工具
Loading...
Tower.im 团队还提供了另外一款网络服务:团队工作日志工具 ,有兴趣的同学可以参考。
与另外一款时间管理工具 doit.im 一样,Tower.im 也是国产网络服务中的优秀代表。
注册后的 Tower.im 会有一个熟悉Tower 的指导性项目,你可以那这个项目练练手,熟悉后删除掉创建自己的项目即可。
对于习惯了类似 Google Group 这种邮件列表形式讨论组形式的同学来说,Tower.im 也完全适用,在线讨论可以通过回复邮件来完成。
update:免费版与付费版区别:
? 包含收费版基础功能
? 最多可管理 5 项目
? 不限制团队人数
? 可随时升级到收费版
确实很方便,界面很简洁,很漂亮,比Gmail的还能清晰一下
按分类查看文章:
大家都在讨论些什么
: 不错: 这真的是个好东西....: Fast File Transfer挺好用的: 断崖不可怕 可怕的是鼓包 我买的各种电池无论牌子多赢 都会鼓包 上个手机都给我屏幕顶出1-2毫米 就因为没注意这问题……: 其实也不一定真的这样无聊了,毕竟还有几个月的时间,修修补补还是可以的。: 发布会现场的演示来看,真的只是一款跑酷吃金币游戏: 时间成本也是成本
最热门标签
传说中的小众软件 让你的手机应用与众不同。
个人 blog 转载时请遵循 “署名-非商业性使用-相同方式共享” 的创作共用协议;
商业网站或未授权媒体不得复制本站内容。一种基于cuda实现多任务共享gpu的方法
专利名称一种基于cuda实现多任务共享gpu的方法
技术领域本发明涉及一种多任务共享GPU的实现方法,具体涉及在NVIDA的CUDA架构中合并多个任务,实现任务并行的方法,属于GPGPU计算领域。
背景技术GPGPU (General-purpose computing on graphics processing units),是利用GPU来进行大规模计算的技术。CUDA是NVIDA公司提供的GPGPU架构。CUDA自从推出开始,就成为广泛应用的众核并行计算形式。
GPU具有远远高于CPU的浮点运算能力和内存带宽(附图I),同时由于其高度的并行性,非常适合于大规模数据处理。然而,由于GPU的硬件设计,GPU上的编程和CPU上的并行编程有所不同。一个显著的区别就是,GPU不支持多任务共享每个任务在GPU上的运行都是对GPU的硬件资源独占的,不允许有其他的Kernel也在执行。例如,当多个任务都要使用GPU的时候,只能够一个一个的顺序地执行,而不能一起同时在GPU上运行。这一点和CPU上允许进程之间进行切换是有很大的不同。目前,尚未发现有专利或者文献针对GPU上的多任务共享进行讨论。
本发明所使用的一些术语定义如下Kernel =CUDA架构中,GPU 一次运行所执行的代码。Thread, Block, Grid CUDA架构中,一个大的Kernel被划分为了很多小的基本单位,称为线程(Thread)。所有Thread组织成为了两级结构。(附图2)首先,这些Thread划分为了若干个线程块(Block),每个Block包含相同数目的Thread。Thread是以Block为单位分发到硬件资源上来执行的。在Block内部,线程的ID编号可以采用一维、二维或者三维,这称为Block维数。在某一个确定的Kernel里面,每个Block都含有相同的维数,以及每一维上相同的大小(这称为维度)。维数和维度都是在GPU启动Kernel之前由程序员指定好的,执行过程中是不能改变的。然后,所有的Block组成的整体(也就是所有的Thread)称为线程网格(Grid)。和Block的维数定义类似,Block的ID编号,可以组织成一维、二维或者三维,称为Grid的维数,每一维上的大小称为维度。SM (Streaming Multiprocessor) :GPU上的硬件单元,包括运算单元、寄存器、片上存储器。每个Block都会被分配到SM上进行执行。一个Block只能在一个SM上执行,一个SM上可以同时执行一个或者多个Block (取决于单个Block消耗的寄存器、片上存储器资源的数目)。Global Memory :显卡上的存储器,属于片外存储器,GPU可以从中读取,但是速度相对比较慢。Shared Memory GPU上的一种片上存储器,每个SM中拥有一定数量的SharedMemory,通常为KB级大小,可以视作一种可供程序员维护的Cache,在CUDA架构中有非常重要的意义。任务分块单个任务划分为多个子任务,每个子任务称为任务分块。一个任务分块将会对应到一个Block中完成计算。本发明旨在提 供一种方法使得在CUDA架构上实现多任务共享GPU,解决现有GT200架构不支持多任务共享GPU的问题。本发明的原理包括三点I.对每个Block执行的任务分块,在GPU运行之初由程序员通过对一个映射表的赋值来确定。通常,每个Block执行的任务分块,在算法设计的时候就已经固定。本发明通过增加一个映射表,使得能够在GPU启动之前,程序员可以对每个Block执行的任务分块进行重排。2.利用GPU高并行度的特点,把多个任务的Block合并到的一个Kernel中去。CUDA架构中,可以同时启动成百上千的线程(Thread),进行并行度非常高的计算任务。所有的Thread被按照一定数目组织成为若干的Block。本发明让一个GPU在一个Kernel中同时启动大量的Block,执行所有任务的任务分块。3.考虑到任务之间可能具有约束性,利用GPU动态调度Block到SM上的特性,处理约束关系。CPU上一种通常的做法是,如果有约束关系,那么在需要同步的地方,直接使用原子操作即可。虽然GPU也支持原子操作,但是原子操作的代价是非常大的,会带来性能上的严重损失,并且极易造成死锁。本发明充分考虑到了 GPU调度Block的规律性。GPU通常拥有数十到上百个SM。GPU上的Block在启动的时候并不会拥有硬件资源,而是在执行的过程中,动态地把Block分发给SM。但SM的数量一般相对于Block少很多,所以每个时刻,在SM上执行的Block只是一部分,其他的Block只能等待。一旦有SM上Block的任务计算结束,GPU回收得到空闲资源的时候,就会从尚未执行的Block中选取一定的Block分发到有空闲资源的SM上去。为Block分配资源的时候,是有一定的顺序性的,这种顺序性表现为I.总是优先分发ID编号较小的Block到SM上去。例如ID编号为O的Block分发到SM上去的时间总是不晚于ID编号为I的Block被分发的时间。2.相对的,回收Block资源的时候,也是优先回收ID编号较小的Block的空闲资源。例如ID编号为O的Block尚未结束,ID编号为10的Block执行结束,但此时GPU不会回收编号为10的Block的资源,因为ID编号更小,ID编号为O的Block的资源并未被回收。根据这种顺序性,本发明先把需要优先执行的任务,在映射表中适当排序I.被其他任务依赖的任务,使ID编号较小的Block来执行它的任务分块,这样它会优先获得资源,被调度到SM上去进行先执行;2.依赖于其他任务的任务,使ID编号较大的Block来执行它的任务分块,同时,辅以适当的阻塞等待操作,保证其依赖的任务已经完全执行结束。完整的技术方案如下(流程参见图4):一种基于CUDA实现多任务共享GPU的方法,包括如下步骤I)在Global Memory中建立映射表,确定合并后的Kernel中,每个Block执行的任务编号和任务分块编号;2) 一次用一个Kernel启动N个Block,N等于所有任务的任务分块数目之和;3)用标记和阻塞等待的方法,满足原有任务之间的约束关系;
4)对于Shared Memory,采用预申请和静态分配的方式进行多任务共享。其中,步骤I)的优选实现方法如下I. I)映射表要给出Block到任务和任务分块的映射关系,即确定某个Block执行哪个任务的哪个分块;I. 2)任务在映射表中的排布要求满足约束条件的拓扑顺序如果任务A依赖于任务B,那么,执行任务A的所有Block的ID编号应该大于所有执行任务B的Block的ID编号;I. 3)在满足步骤I. 2)所述的约束条件的情况下,其他无约束关系任务在映射表中以任意的方式进行排布。步骤2)的优选实现方法如下2. I)将原有的任务的grid维数转换为一维原有的任务可能是有不同的grid维数和维度,这里可以统一选取一维;如果原来的任务是多维的,只需要进行一维到多维的换算即可;2. 2)若Block的维数不一致,则将之统一转换为一维;若转成一维之后Block的维度不一致,则统一选取一个最大的维度,让其他较小的Block添加空线程补足,这样所有的任务都采用了相同的Block维数和维度;2. 3)所有的Block在开始执行计算之前,首先从映射表中获取该Block需要执行的任务编号和任务分块编号;2. 4)根据步骤2. 3)中读取的任务编号,选择执行不同的任务代码;将步骤2. 3)中读取的任务分块编号,使用到具体的任务计算中去。步骤3)的优选实现方法如下3. I)给每个任务设置标志位mark,每个任务的每个任务分块设置标记数组tag □,用以标记任务和任务分块的执行情况;3. 2)对于任务的每一个任务分块,在该任务分块完成之后,将对应的标记位tag置位,表明该任务分块已经执行结束;3.3)用每个任务的最后一个Block,在计算返回前阻塞,循环检查同一任务的其他任务分块的对应tag标记位是否已经被置位,一旦全部被置位,则对标志位mark置位,表明该任务已经结束;3. 4)如果任务A需要依赖于任务B,那么在任务A计算开始之前阻塞,循环检测B的任务标志位mark,直到其置位。步骤4)的优选实现方法如下4. I)预先在Kernel开始的时候,申请一个足够大的Shared Memory数组,其大小至少应该等于每个任务所需要的Shared Memory用量的最大值;4. 2)每个任务单独写成一个函数,将Shared Memory数组地址传给这个函数,函数中需要使用Shared Memory的时候,直接在这个数组中静态分配使用。通过本发明,可以简便地实现在现有GPU硬件架构上实现多任务共享,可以简化实际应用中的编程工作,并在一定情况下取得良好的性能。
图IGPU的浮点运算能力存储器带宽同CPU的比较(图片来源NVIDIA CUDAProgramming Guide Version 2. 3)
图 2GPU 中的 Thread, Block, Grid 结构(图片来源NVIDIA CUDA ProgrammingGuide Version 2. 3)图3两种映射表的排布。图3(a)实施方案中的3个任务使用图形表示(约束关系用箭头表不,任务I依赖于任务0);图3(b) —种合法的映射表排布;图3(c) —种不合法的映射表排布(任务I依赖于任务0,却有Block排布到了任务O前面)。图4本发明所述方法的流程图。
具体实施例方式以下以一个具体的例子,对本发明做进一步的说明。但是需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解在不脱离本发明及所附的权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。具体的例子是3个计算任务(具体任务内容此处并无影响)。任务存在以下的约束关系任务I必须在任务O完成后才能进行,因为任务I需要使用任务O的结果,而任务2同任务O和任务I没有任何约束关系。(附图3 (a),圆圈代表任务,箭头代表依赖关系)使用技术方案中所述的方法实现任务并行。为了方便叙述,定义以下device函数分别完成3个计算任务,分别称为任务0,I和2。
任务 O device void computeO (...);
任务 I device void computel (...);
任务 2 device void compute2(...);同时假设每个任务都进行了相同大小的任务分块,各自的计算任务划分为了 N个任务分块。实施过程分为以下步骤A.建立映射表开辟两个一维的数组,长度等于所有任务的任务分块数之和,此例中为3*N。两个数组的具体含义如下I. task_id□,取值为0、1或者2。这个数组给出了 Kernel中的Block需要执行的任务。例如,图3(b),task_id
到task_id[N_l]的值都为0,代表了 Block ID从O到N-I的Block都要执行任务O ;其他值为I和2的元素,意义类似。2. block_id□,取值为O到N-I。这个数组给出了 Kernel中Block需要执行的分块编号。例如,图3 (b),block_id[N]等于0,代表了编号为N的Block需要执行编号为O的任务分块(任务编号由I中的task_id指定)。编号的顺序需要满足具体问题所要求的任务之间的约束关系。任务I依赖于任务0,所以执行任务I的分块的那些Block, ID编号应该大于执行任务O的Block ID编号。例如简单地做法,把任务O和任务2的block排布到前端,任务I的block排布到后端,如图3(b)所不。而图3 (C)的排布是不满足约束关系的拓扑序的,任务I的分块被排布到了任务O前面,在GPU的调度过程中会首先执行,造成错误,所以是是不合法的。确定好顺序之后,可以在Kernel启动之前直接对task_id[]和block_id[]进行赋值即可。B.启动 Kernel定义一个合并后的Kernel, Block的数目等于原有所有任务的任务分块数之和,此例中为3*N。这个Kernel的参数列表应该传入三个任务需要的所有参数。合并的Kernel应该先获取自身的Block ID号bidx
1.一种基于CUDA实现多任务共享GPU的方法,包括如下步骤
1)在GlobalMemory中建立映射表,确定合并后的Kernel中,每个Block执行的任务编号和任务分块编号;
2)一次用一个Kernel启动N个Block,N等于所有任务的任务分块数目之和;
3)用标记和阻塞等待的方法,满足原有任务之间的约束关系;
4)对于SharedMemory,采用预申请和静态分配的方式进行多任务共享。
2.如权利要求I所述的方法,其特征是,步骤I)的实现方法如下
I. D映射表要给出Block到任务和任务分块的映射关系,即确定某个Block执行哪个任务的哪个分块;
I. 2)任务在映射表中的排布要求满足约束条件的拓扑顺序如果任务A依赖于任务B,那么,执行任务A的所有Block的ID编号应该大于所有执行任务B的Block的ID编号;
1.3)在满足步骤I. 2)所述的约束条件的情况下,其他无约束关系任务在映射表中以任意的方式进行排布。
3.如权利要求I所述的方法,其特征是,步骤2)的实现方法如下
2.I)将原有的任务的grid维数转换为一维;
2. 2)若Block的维数不一致,则将之统一转换为一维;若转成一维之后Block的维度不一致,则统一选取一个最大的维度,让其他较小的Block添加空线程补足,这样所有的任务都采用了相同的Block维数和维度;
2. 3)所有的Block在开始执行计算之前,首先从映射表中获取该Block需要执行的任务编号和任务分块编号;
2.4)根据步骤2. 3)中读取的任务编号,选择执行不同的任务代码;将步骤2. 3)中读取的任务分块编号,使用到具体的任务计算中去。
4.如权利要求I所述的方法,其特征是,步骤3)的实现方法如下
3.I)给每个任务设置标志位mark,每个任务的每个任务分块设置标记数组tag□,用以标记任务和任务分块的执行情况;
3. 2)对于任务的每一个任务分块,在该任务分块完成之后,将对应的标记位tag置位,表明该任务分块已经执行结束;
3.3)用每个任务的最后一个Block,在计算返回前阻塞,循环检查同一任务的其他任务分块的对应tag标记位是否已经被置位,一旦全部被置位,则对标志位mark置位,表明该任务已经结束; 、 3.4)如果任务A需要依赖于任务B,那么在任务A计算开始之前阻塞,循环检测B的任务标志位mark,直到其置位。
5.如权利要求I所述的方法,其特征是,步骤4)的实现方法如下
、4.I)预先在Kernel开始的时候,申请一个足够大的Shared Memory数组,其大小至少应该等于每个任务所需要的Shared Memory用量的最大值; 、 4.2)每个任务单独写成一个函数,将Shared Memory数组地址传给这个函数,函数中需要使用Shared Memory的时候,直接在这个数组中静态分配使用。
本发明公布了一种基于CUDA实现多任务共享GPU的方法。包括在Global Memory中建立映射表,确定合并后的Kernel中,每个Block执行的任务编号和任务分块编号;一次用一个Kernel启动N个Block,N等于所有任务的任务分块数目之和;用标记和阻塞等待的方法,满足原有任务之间的约束关系;对于Shared Memory,采用预申请和静态分配的方式进行多任务共享。通过本发明,可以简便地实现在现有GPU硬件架构上实现多任务共享,可以简化实际应用中的编程工作,并在一定情况下取得良好的性能。
文档编号G06F9/50GKSQ
公开日日 申请日期日 优先权日日
发明者蒋吴军, 陈一峯, 黄锟 申请人:北京大学, 华为技术有限公司90 牛头人 圣骑士
现在版本更新太快,往往一个角色就忙不过来了,然后因为声望的限制,再重玩一个小号几乎是不可能的事。我认为在成就共享系统里还有很多地方可以改进。最大的愿望就是同一个账号里,角色的声望可以共享,角色所完成的任务可以共享。
90 牛头人 德鲁伊
同感啊,之前辛辛苦苦去打造我的小D,各种任务、声望、成就各种刷,直到刷的我恶心我还在坚持!但是现在我又想我玩一个新的LR,可是玩了LR突然发现任务、声望、成就还要重新去刷,光从头到尾的任务、声望都让我想删号的冲动,最后玩了几天又回去玩D了。可是玩着D我总是想着去玩LR,玩了LR看到声望任务我又回去玩D,靠,一个游戏整的我好纠结好纠结。我就想问暴雪的负责人,你们从头到尾把任务声望全刷了全天在线刷需要多少时间,没个几个月几年的可能刷完吗,何况我们现在上班,一天就那晚上几个小时时间,做个日常打个本都没时间了,这不是扯淡吗!!!针对这种严重的问题至今没有处理结果,我看我还是玩剑三吧,这样就不纠结了!!!
90 兽人 战士
赶快想想对策吧!
舂滒乄噯情偙
90 人类 猎人
就是因为不共享- -!导致我放弃不了这个猎人号- -!!!!!
100 人类 圣骑士
楼主你是我的知音啊!!!找到知音了!!!
100 狼人 潜行者
任务还行,每个号都刷一遍声望太麻烦了
牛叉的小萌
100 人类 法师
任务共享估计没希望,声望共享是我的心声啊!
100 亡灵 术士
声望共享是必须的,速度推出角色声望共享功能。
灬乂冫小妮灬
100 血精灵 猎人
魔兽不进步,就等于退步!不改进,迟早流失玩家!其实我一共11个90号,现在玩的也只有3个,其他真心玩不动。累啊!光一个永恒岛声望就够我喝一壶了!表示顶LZ,LZ万岁!
100 人类 法师
我也同感啊,我这法师从05年就不赶放弃,玩ss玩sm都想着fs....重刷声望太难了..
100 人类 法师
任务共享就不用了,也不太现实,声望的话倒是希望可以有,毕竟80+的势力声望要达到崇拜~~会死人的~我算过了~~每天刷声望要达到现在版本所有的的势力(能达到崇拜的)起码要3个月以上,而且还必须每天把所有的日常都做了,关于势力的声望任务也要全做,起码要5个小时,其实最蛋疼的就是战场声望~~~战歌的~要打1000+场啊~~
100 亡灵 死亡骑士
就是啊,我现在想去完成那一个信仰,就是战士。但是又不舍得DK,我是成就党,各种声望,任务不能共享!!!!
小牛最帅气啦
90 牛头人 死亡骑士
就是 现在想叮小号 但叮了估计最后还是只玩老号
100 矮人 萨满祭司
啊啊啊啊知音 啊啊啊啊 求顶上去
奈奈格熊熊
1 人类 战士
这个真是要顶一下的,任务就算了,声望真是要共享的
奈奈格熊熊
1 人类 战士
还有某些橙武能否设置成可以收藏呢,像传家宝那样
爱幕四十八号
100 人类 猎人
这基本上是不可能的事情。
110 血精灵 猎人
理想很丰满,现实很骨感
二叁肆伍六
100 血精灵 猎人
共享了他们怎么赚你的点卡钱呢
燕赵的小瑞
110 血精灵 潜行者
任务没有必要共享,声望共享是必须的啊。魔兽10多年了,声望好几十个,从新刷一遍根本不可能,这就让很多人没法舍去大号,玩玩别的小号。
暴力威胁。我们将严肃对待此类行为,并会上报有关部门。
发布的主题中包含其他玩家的个人信息。包括实际地址、邮箱地址、电话号码及不当的照片和/或视频。
骚扰或歧视性用语。此类言辞将不允许出现。
现实生活中的威胁
失效的链接
阐述理由(最多256字)

我要回帖

更多关于 如何实现资源共享 的文章

 

随机推荐