CN102323917B - 一种基于共享内存实现多进程共享gpu的方法 - Google Patents
一种基于共享内存实现多进程共享gpu的方法 Download PDFInfo
- Publication number
- CN102323917B CN102323917B CN 201110262389 CN201110262389A CN102323917B CN 102323917 B CN102323917 B CN 102323917B CN 201110262389 CN201110262389 CN 201110262389 CN 201110262389 A CN201110262389 A CN 201110262389A CN 102323917 B CN102323917 B CN 102323917B
- Authority
- CN
- China
- Prior art keywords
- gpu
- client
- service end
- signal
- shared memory
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种基于共享内存实现多进程共享GPU的方法,目的是解决单个异构计算结点上SPMD程序的多个进程之间不能共享使用GPU的问题。技术方案是启动GPU服务端,GPU服务端等待GPU客户端请求信号的到来。启动GPU客户端,在需要GPU加速时,GPU客户端发送请求信号给GPU服务端,GPU服务端响应最先接收到的请求信号,使用GPU进行加速计算,同时GPU客户端执行CPU的计算过程。GPU计算过程中,来自GPU客户端的请求信号进入操作系统的信号队列排队。GPU计算完成后,GPU服务端响应信号队列中的其它请求信号。在只包含一个GPU的单个异构计算结点上,采用本发明可以使SPMD程序的多个需要GPU加速的进程在运行时不会出现运行故障,GPU可以被多个进程共享使用。
Description
技术领域
本发明涉及图形处理单元GPU(Graphics Processing Unit)的共享方法,尤其指基于共享内存进行数据通信在多进程间共享GPU的方法。
背景技术
近年来,随着GPU硬件技术以及编程模型的不断发展,GPU强大的计算能力受到越来越多的重视,大量的科学计算程序都采用GPU加速其关键代码段,获得了良好的加速比。使用GPU的科学计算程序的任务为:初始化GPU,为GPU准备数据,GPU计算,GPU将计算结果写回,释放GPU。
然而,现有的GPU不支持多个进程同时访问。当一个进程初始化GPU之后,在释放GPU之前,其它的进程是无法使用GPU的。SPMD(Single Program Multi Data,单程序多数据)的并行程序是现在的科学计算程序的主流并行编程模式,对于SPMD的并行程序,每个进程执行的代码是相同的,只是处理的数据不同。当SPMD并行程序的多个进程运行在单个异构计算结点(由一个或多个CPU、一个GPU构成,如图1所示)上时,在SPMD程序利用GPU加速的计算过程中,由于每个进程执行的代码是相同的,多个进程会同时竞争使用同一个GPU,这样就会导致并行程序出现运行故障。如图2所示,P0和P1是指异构计算结点上运行的SPMD程序的进程,这两个进程会同时竞争同一个GPU,导致并行程序无法运行。
目前,美国专利US20090201303A1“Multi-User Multi-GPU Render Server ApparatusAnd Methods”给出了一种网络环境下多个用户共享使用一个GPU服务端的方法。GPU服务端是一个含有一个或多个GPU设备的计算结点,一个或多个客户端计算机可以同时连接到GPU服务端。GPU服务端接收客户端的消息,创建数据集的绘制图像,然后,将绘制的图像发回到客户端。但是,这种网络环境中共享GPU的方法中,客户端与服务端之间的数据传输通过网络完成,传输速度慢,不能适用于单个计算结点上多个进程共享使用GPU的情况。
综上所述,当前的专利与文献中未见有如何在CPU+GPU的异构计算结点(由一个或多个CPU、一个GPU构成)上多个SPMD程序的进程共享GPU的相关报道,在单个异构计算结点上解决SPMD程序的进程共享使用GPU是本领域技术人员迫切希望解决的技术问题。
发明内容
本发明要解决的技术问题在于:针对单个异构计算结点上SPMD程序的多个进程之间不能共享使用GPU的情况,提出了一种基于共享内存进行数据通信的方法,实现多进程共享使用GPU。以下将SPMD程序的进程简称为进程。
请求GPU加速的进程称为GPU客户端,响应GPU加速请求的进程称为GPU服务端。计算结点中存在多个GPU客户端和一个GPU服务端。
本发明的技术方案为:启动GPU服务端,GPU服务端等待GPU客户端请求信号的到来。启动GPU客户端,在需要GPU加速时,GPU客户端发送请求信号给GPU服务端,GPU服务端响应最先接收到的请求信号,使用GPU进行加速计算,同时GPU客户端执行CPU的计算过程。GPU计算过程中,来自GPU客户端的请求信号进入操作系统的信号队列排队。GPU计算完成后,GPU服务端响应信号队列中的其它请求信号。
具体技术方案为:
第一步、启动GPU服务端,GPU服务端使用系统调用sigaction为每个用户信号(即GPU客户端请求GPU加速计算的信号)设置不同的信号处理函数,信号处理函数是SPMD程序中的GPU计算过程,即利用GPU进行加速的计算过程;
第二步、GPU服务端定义一个信号集合sigusrset,清空sigusrset集合,将设置了信号处理函数的用户信号添加到sigusrset信号集合中;
第三步、GPU服务端检查操作系统的信号队列中有是否存在未处理的用户信号,如果不存在,GPU服务端执行第四步,否则GPU服务端执行第八步;
第四步、GPU服务端等待从GPU客户端发来的sigusrset信号集合中的用户信号,如果没有用户信号到来,GPU服务端一直等待;否则,GPU服务端执行第八步;
第五步、启动所有的GPU客户端,每个GPU客户端在计算结点的内存中分配一块共享内存空间,所述GPU客户端对应的共享内存空间的标识是GPU客户端的进程号pid,并使用系统调用shmat将所述GPU客户端对应的共享内存空间关联到GPU客户端的地址空间,使GPU客户端可以访问共享内存;
第六步、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客户端跳转到第六步。
与现有技术相比,采用本发明可达到以下技术效果:在只包含一个GPU的单个异构计算结点上,采用本发明可以使SPMD程序的多个需要GPU加速的进程在运行时不会出现运行故障,GPU可以被多个进程共享使用。
附图说明
图1是一个异构计算结点结构图。
图2传统的多进程使用GPU的方法图。
图3本发明中多进程共享使用GPU示意图。
图4是本发明总体流程图。
具体实施方案
图3是本发明中多进程共享使用GPU示意图。
计算结点上运行两个GPU客户端和一个GPU服务端。每个GPU客户端分配一块自己的内存空间,以GPU客户端的进程号pid为标识。GPU客户端使用GPU时,发送用户信号,用户信号进入信号队列。GPU服务端响应信号队列中的用户信号,进入信号处理函数,使用GPU进行加速计算。
图4是本发明总体流程图。
为了检验本发明效果,国防科大计算机学院在CPU+GPU的单个异构计算结点上进行了实验验证,结点具体配置如下:两个Intel Xeon 5670六核CPU,每个核的频率为2.93GHz,两个CPU的双精度浮点计算理论峰值为140Gflops;GPU加速器:NVIDIA Fermi。测试的程序为HPLinpack2.0,程序的核心是使用LU分解方法求解稠密矩阵线性方程组,矩阵数据为随机生成的双精度浮点值。测试程序采用CUDA(Compute Unified DeviceArchitecture)编程模型实现了双精度浮点稠密矩阵乘加(Am×n×Bn×k+Cm×n)的GPU加速。应用程序的主要输入参数为:N=50000,NB=896,P=1,Q=2。使用GPU加速的HPLinpack2.0是SPMD的并行程序,不使用本发明时,单个异构计算结点上运行两个进程时出现运行故障。
测试时在单个结点上运行两个进程,每个进程使用一个Xeon 5670CPU和GPU参与计算。系统中存在一个GPU服务端和两个GPU客户端。采用本发明进行两个进程共享GPU时,如图4所示,步骤如下:
第一步、启动GPU服务端,GPU服务端定义一个用户信号SIGDGEMM,将SIGDGEMM的信号处理函数设置为dgemm_handler,dgemm_handler是双精度浮点稠密矩阵乘加的GPU加速计算过程;
第二步、GPU服务端定义一个信号集合sigusrset,使用操作系统调用sigemptyset清空sigusrset集合,将用户信号SIGDGEMM添加到sigusrset信号集合中;
第三步、GPU服务端检查操作系统的信号队列中有是否存在未处理的SIGDGEMM信号,如果有,GPU服务端执行第八步,否则GPU服务端执行第四步;
第四步、GPU服务端等待从GPU客户端发来的SIGDGEMM信号,如果没有用户信号到来,GPU服务端一直等待;否则,GPU服务端执行第八步;
第五步、启动两个GPU客户端,两个GPU客户端使用操作系统的系统调用shmget分配自己的共享内存空间,所述GPU客户端对应的共享内存空间的标识是GPU客户端的进程号pid,并使用操作系统调用shmat将所述GPU客户端对应的内存空间关联到GPU客户端的地址空间;
第六步、GPU客户端执行其计算任务,当两个GPU客户端进入双精度浮点稠密矩阵乘加计算过程时,将双精度浮点稠密矩阵乘加的矩阵数据传输到所述GPU客户端对应的共享内存空间中,设置所述GPU客户端对应的共享内存空间中的计算完成标识finished为0;
第七步、每个GPU客户端使用系统调用sigqueue向GPU服务端发送信号SIGDGEMM,SIGDGEMM信号中包含GPU客户端的进程号pid信息,GPU客户端执行第十一步;
第八步、GPU服务端被先到达的SIGDGEMM信号唤醒,根据SIGDGEMM信号中包含的pid信息,GPU服务端将标识为pid的共享内存空间关联到GPU服务端的地址空间,GPU服务端可以访问这块地址空间的矩阵数据;
第九步、GPU服务端执行信号处理函数dgemm_handler,进行GPU的加速计算,未被响应的GPU客户端的SIGDGEMM信号在操作系统的信号队列中排队;
第十步,GPU服务端将计算结果写回标识为pid的共享内存空间,设置这个共享内存空间中的计算完成标识finished为1,并释放对此共享内存空间的关联,GPU服务端跳转到第三步;
第十一步,每个GPU客户端判断自己的共享内存空间中的计算完成标识finished是否为1,如果不为1,表明GPU加速过程未结束,GPU客户端等待GPU服务端将finished设置为1,同时,GPU客户端执行其CPU的计算任务;若为1,表明GPU加速过程已结束,GPU客户端执行第十二步;
第十二步,每个GPU客户端继续运行其计算任务,如其计算任务已完成,则GPU客户端利用系统调用shmctl删除自己的共享内存空间,结束运行;否则,GPU客户端跳转到第六步。
使用本发明时应用程序运行时间为231.40秒,性能为360.1Gflops;不使用本发明时,应用程序运行过程中出现访问GPU设备错,无法在单结点上运行并行程序的多个进程。
Claims (1)
1.一种基于共享内存实现多进程共享GPU的方法,其特征在于包括以下步骤:
第一步、启动GPU服务端,GPU服务端使用系统调用sigaction为每个用户信号设置不同的信号处理函数,用户信号指GPU客户端请求GPU加速计算的信号,信号处理函数是SPMD即单程序多数据程序中的GPU计算过程,即利用GPU进行加速的计算过程;
第二步、GPU服务端定义一个信号集合sigusrset,清空sigusrset集合,将设置了信号处理函数的用户信号添加到sigusrset信号集合中;
第三步、GPU服务端检查操作系统的信号队列中有是否存在未处理的用户信号,如果不存在,GPU服务端执行第四步,否则GPU服务端执行第八步;
第四步、GPU服务端等待从GPU客户端发来的sigusrset信号集合中的用户信号,如果没有用户信号到来,GPU服务端一直等待;否则,GPU服务端执行第八步;
第五步、启动所有的GPU客户端,每个GPU客户端在计算结点的内存中分配一块共享内存空间,所述GPU客户端对应的共享内存空间的标识是GPU客户端的进程号pid,并使用系统调用shmat将所述GPU客户端对应的共享内存空间关联到GPU客户端的地址空间,使GPU客户端可以访问共享内存;
第六步、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客户端跳转到第六步。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110262389 CN102323917B (zh) | 2011-09-06 | 2011-09-06 | 一种基于共享内存实现多进程共享gpu的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201110262389 CN102323917B (zh) | 2011-09-06 | 2011-09-06 | 一种基于共享内存实现多进程共享gpu的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102323917A CN102323917A (zh) | 2012-01-18 |
CN102323917B true CN102323917B (zh) | 2013-05-15 |
Family
ID=45451661
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201110262389 Expired - Fee Related CN102323917B (zh) | 2011-09-06 | 2011-09-06 | 一种基于共享内存实现多进程共享gpu的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102323917B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8669990B2 (en) | 2009-12-31 | 2014-03-11 | Intel Corporation | Sharing resources between a CPU and GPU |
CN103810124A (zh) * | 2012-11-09 | 2014-05-21 | 辉达公司 | 用于数据传输的系统及方法 |
CN103226540B (zh) * | 2013-05-21 | 2015-08-19 | 中国人民解放军国防科学技术大学 | 基于分组多流的gpu上多区结构网格cfd加速方法 |
US9401003B2 (en) * | 2013-11-18 | 2016-07-26 | Zebrafish Labs, Inc. | Just-in-time processing of images |
US9654602B2 (en) | 2014-01-22 | 2017-05-16 | Zebrafish Labs, Inc. | User interface for just-in-time image processing |
CN106681694A (zh) * | 2016-12-30 | 2017-05-17 | 中国科学院计算技术研究所 | 基于NVIDIA Kepler GPU汇编指令的单精度矩阵乘优化方法与系统 |
CN110928702B (zh) * | 2018-09-20 | 2023-03-21 | 北京君正集成电路股份有限公司 | 多进程消息通讯系统 |
US11210757B2 (en) * | 2019-12-13 | 2021-12-28 | Advanced Micro Devices, Inc. | GPU packet aggregation system |
CN112199326B (zh) * | 2020-12-04 | 2021-02-19 | 中国人民解放军国防科技大学 | 阵列异构型计算系统上动态构建软件超结点的方法和装置 |
CN116723191B (zh) * | 2023-08-07 | 2023-11-10 | 深圳鲲云信息科技有限公司 | 利用加速装置执行数据流加速计算的方法和系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101551761A (zh) * | 2009-04-30 | 2009-10-07 | 浪潮电子信息产业股份有限公司 | 一种异构多处理器中共享流内存的方法 |
CN102103567A (zh) * | 2009-12-21 | 2011-06-22 | 英特尔公司 | 在异构处理器之间共享基于虚拟存储器的多版本数据 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8669990B2 (en) * | 2009-12-31 | 2014-03-11 | Intel Corporation | Sharing resources between a CPU and GPU |
-
2011
- 2011-09-06 CN CN 201110262389 patent/CN102323917B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101551761A (zh) * | 2009-04-30 | 2009-10-07 | 浪潮电子信息产业股份有限公司 | 一种异构多处理器中共享流内存的方法 |
CN102103567A (zh) * | 2009-12-21 | 2011-06-22 | 英特尔公司 | 在异构处理器之间共享基于虚拟存储器的多版本数据 |
Also Published As
Publication number | Publication date |
---|---|
CN102323917A (zh) | 2012-01-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102323917B (zh) | 一种基于共享内存实现多进程共享gpu的方法 | |
US11429442B2 (en) | Parallel and distributed computing using multiple virtual machines | |
CN106663028B (zh) | 动态碎片分配调整 | |
CN104866374A (zh) | 基于多任务的离散事件并行仿真及时间同步方法 | |
CN111367630A (zh) | 一种基于云计算的多用户多优先级的分布式协同处理方法 | |
US20210357759A1 (en) | Task processing method and device based on neural network | |
JP2022515302A (ja) | 深層学習モデルをトレーニングするための方法及び装置、電子機器、コンピュータ可読記憶媒体並びにコンピュータプログラム | |
EP2807555B1 (en) | Para-virtualized asymmetric gpu processors | |
CN108416433A (zh) | 一种基于异步事件的神经网络异构加速方法和系统 | |
US9378533B2 (en) | Central processing unit, GPU simulation method thereof, and computing system including the same | |
Lin et al. | Echo: An edge-centric code offloading system with quality of service guarantee | |
CN111400000A (zh) | 网络请求处理方法、装置、设备和存储介质 | |
Parker | A flexible, large-scale, distributed agent based epidemic model | |
US20170097854A1 (en) | Task placement for related tasks in a cluster based multi-core system | |
CN114610474A (zh) | 一种异构超算环境下多策略的作业调度方法及系统 | |
CN111352896B (zh) | 人工智能加速器、设备、芯片以及数据处理方法 | |
WO2023274278A1 (zh) | 一种资源调度的方法、装置及计算节点 | |
CN106227594A (zh) | 一种基于分屏的多核cpu帧缓存显示优化方法 | |
Goswami et al. | Landrush: Rethinking in-situ analysis for gpgpu workflows | |
Garibay-Martínez et al. | On the scheduling of fork-join parallel/distributed real-time tasks | |
Alhussian et al. | An unfair semi-greedy real-time multiprocessor scheduling algorithm | |
CN115775199B (zh) | 数据处理方法和装置、电子设备和计算机可读存储介质 | |
Zhang et al. | Gang scheduling extensions for I/O intensive workloads | |
Liu et al. | BSPCloud: A hybrid distributed-memory and shared-memory programming model | |
CN112732634B (zh) | 面向边缘计算的arm-fpga协同局部动态重构处理方法 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130515 Termination date: 20170906 |
|
CF01 | Termination of patent right due to non-payment of annual fee |