发明名称 一种基于共享内存实现多进程共享GPU的方法
摘要 本发明公开了一种基于共享内存实现多进程共享GPU的方法,目的是解决单个异构计算结点上SPMD程序的多个进程之间不能共享使用GPU的问题。技术方案是启动GPU服务端,GPU服务端等待GPU客户端请求信号的到来。启动GPU客户端,在需要GPU加速时,GPU客户端发送请求信号给GPU服务端,GPU服务端响应最先接收到的请求信号,使用GPU进行加速计算,同时GPU客户端执行CPU的计算过程。GPU计算过程中,来自GPU客户端的请求信号进入操作系统的信号队列排队。GPU计算完成后,GPU服务端响应信号队列中的其它请求信号。在只包含一个GPU的单个异构计算结点上,采用本发明可以使SPMD程序的多个需要GPU加速的进程在运行时不会出现运行故障,GPU可以被多个进程共享使用。
申请公布号 CN102323917A 申请公布日期 2012.01.18
申请号 CN201110262389.3 申请日期 2011.09.06
申请人 中国人民解放军国防科学技术大学 发明人 杜云飞;杨灿群;易会战;王锋;黄春;赵克佳;陈娟;李春江;左克;彭林
分类号 G06F15/167(2006.01)I;G06F9/50(2006.01)I 主分类号 G06F15/167(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 一种基于共享内存实现多进程共享GPU的方法,其特征在于包括以下步骤:第一步、启动GPU服务端,GPU服务端使用系统调用sigaction为每个用户信号设置不同的信号处理函数,用户信号指GPU客户端请求GPU加速计算的信号,信号处理函数是SPMD即单程序多数据程序中的GPU计算过程,即利用GPU进行加速的计算过程;第二步、GPU服务端定义一个信号集合sigusrset,清空sigusrset集合,将设置了信号处理函数的用户信号添加到sigusrset信号集合中;第三步、GPU服务端检查操作系统的信号队列中有是否存在未处理的用户信号,如果不存在,GPU服务端执行第四步,否则GPU服务端执行第八步;第四步、GPU服务端等待从GPU客户端发来的sigusrset信号集合中的用户信号,如果没有用户信号到来,GPU服务端一直等待;否则,GPU服务端执行第八步;第五步、启动所有的GPU客户端,每个GPU客户端在计算结点的内存中分配一块共享内存空间,共享内存空间的标识是GPU客户端的进程号pid,并使用系统调用shmat将共享内存空间关联到GPU客户端的地址空间,使GPU客户端可以访问共享内存;第六步、GPU客户端执行其计算任务,当所有的GPU客户端进入利用GPU加速的计算过程时,将计算过程的数据写入共享内存空间,设置共享内存空间中的计算完成标识finished为0;第七步、所有的GPU客户端发送用户信号,请求GPU服务端的GPU加速过程,发送的用户信号中包含GPU客户端进程号pid信息,GPU客户端跳转到第十一步;第八步、GPU服务端被首先到达的用户信号唤醒,GPU服务端将标识为pid的共享内存空间关联到GPU服务端的地址空间,使GPU服务端可以访问这块内存空间的数据;第九步、GPU服务端调用到达用户信号的信号处理函数,执行GPU加速计算过程,未被响应的其它GPU客户端的用户信号在操作系统的信号队列中排队;第十步,GPU服务端将计算结果写回标识为pid的共享内存空间,设置这个共享内存空间中的计算完成标识finished为1,并释放对此共享内存空间的关联,GPU服务端跳转到第三步;第十一步,每个GPU客户端判断自己的共享内存空间中的计算完成标识finished是否为1,如果不为1,表明GPU加速过程未结束,GPU客户端等待GPU服务端将finished设置为1,同时,GPU客户端执行其CPU的计算任务;若为1,表明GPU加速过程已结束,GPU客户端执行第十二步;第十二步,每个GPU客户端继续运行其计算任务,如其计算任务已完成,则GPU客户端删除自己的共享内存空间,结束运行;否则,GPU客户端跳转到第六步。
地址 410073 湖南省长沙市开福区德雅路109号