了解并发和GPU作为有限资源

boh*_*nko 1 theory cuda gpgpu opencl

借助CPU和内存,操作非常简单。

进程具有较大的虚拟地址空间,该地址部分映射到物理内存中。当当前进程尝试访问不在物理内存中的页面时,OS介入,选择要交换的页面(例如,使用Round Robin),将其交换到磁盘中,然后从交换中读取所需的页面,并且控件为回到过程。这很简单,因为如果没有该页面,该过程将无法继续。

GPU内核是另一回事。

让我们考虑一个用例:
一个高优先级[cpu]进程,即X,对内核进行调用(这是一个阻塞调用)。此时,操作系统切换上下文并将CPU分配给另一个进程(即Z)是合理的。举例来说,让进程Z对GPU也做一些繁重的工作。

现在,GPU驱动程序做什么?它是否停止了属于[更高优先级] X的内核?它是否通知OS Z的优先级不足以卸载X的内核?通常,当两个进程需要GPU资源但可用的GPU内存足以一次仅服务其中一个时,会发生什么情况?

Arc*_*are 5

CUDA GPU以粗粒度协作地进行上下文切换(请考虑“ memcpy”或“内核启动”)。如果两个上下文都有足够的内存,则硬件很乐意以很小的性能代价在它们之间进行上下文上下文协作切换。(但是,因为它是协作的,所以长时间运行的内核会干扰其他内核的执行。)

现代GPU确实支持虚拟内存(即通过地址转换的内存保护),但不支持按需分页。这意味着分配后必须物理存在并映射GPU可以访问的每个内存(设备内存和映射的固定内存)。

Windows Vista中引入的Windows显示驱动程序模型(WDDM)会以非常粗糙的粒度进行分页。需要驱动程序跟踪执行给定命令缓冲区所需的“内存对象”,并且OS确保存在这些内存对象。操作系统可以在不需要时将其换出。CUDA的缺点在于,由于可以存储指针,因此必须驻留与CUDA地址空间关联的所有内存对象,才能运行CUDA内核。因此,分页在CUDA上的效果不如在WDDM设计为运行的图形应用程序上好。