GPU 抢占
由于 GPU 核数较多, 抢占 GPU 需要保存大量的上下文信息, 开销较大, 所以目前市场上 GPU 都不支持抢占特性. 只用当前任务完成之后, GPU 才能被下个应用程序使用。 在 GPU 虚拟化的环境中, 多用户使用的场景会导致 GPU 进行频繁的任务切换, 可抢占的 GPU 能够防止恶意用户长期占用, 并且 能够实现用户优先级权限管理。
1 | A CUDA context is a virtual execution space that holds the code and data owned by a host thread or process. Only one context can ever be active on a GPU with all current hardware. |
翻译一下:
尝试建立context并且同时运行在同一GPU设备上的不同的线程或进程,它们会被串行化而且任何等待访问GPU的进程将会被阻塞直到运行的context的进程退出。并没有文档来介绍时间分片还有调度算法。建议最好先启动包含着GPU上下文的单 worker 线程,使用来自别的线程的消息来将工作推给GPU。或者,CUDA driver API有个上下文迁移工具,它也能与来自同一进程的线程配合,但是迁移机制有延迟,对CPU带来负荷。
1 | CUDA activity from independent host processes will normally create independent CUDA contexts, one for each process. Thus, the CUDA activity launched from separate host processes will take place in separate CUDA contexts, on the same device. |
Hyper-Q 技术
为了解决多个Kernel 函数同时在GPU中运行的问题,Nvidia 推出了Hyper-Q这个硬件技术,具体可以参考下面的ppt。目前实行多进程同时运行在GPU的方法是基于NVIDIA的MPS技术