1

有了 CPU 和内存,这很简单。

一个进程有一个很大的虚拟地址空间,它部分映射到物理内存中。当当前进程试图访问不在物理内存中的页面时,操作系统会介入,选择要交换的页面(例如使用循环),将其交换到磁盘中,然后从交换中读取所需的页面,并且控制权是回到流程。这很简单,因为如果没有该页面,该过程将无法继续。

GPU 内核是另一回事。

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

现在,GPU 驱动程序是做什么的?它会停止属于 [更高优先级] X的内核吗?它是否通知操作系统Z的优先级不足以卸载X的内核?一般来说,当两个进程需要 GPU 资源,但可用的 GPU 内存足以一次只为其中一个提供服务时会发生什么?

4

1 回答 1

5

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

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

Windows Vista 中引入的 Windows 显示驱动程序模型 (WDDM) 确实以非常粗略的粒度进行分页。驱动程序需要跟踪执行给定命令缓冲区所需的“内存对象”,并且操作系统确保它们存在。操作系统可以在不需要时将它们换掉。CUDA 的问题在于,由于可以存储指针,所有与 CUDA 地址空间相关的内存对象都必须驻留才能运行 CUDA 内核。因此,分页对 CUDA 的作用不如对 WDDM 设计用于运行的图形应用程序的作用。

于 2013-10-09T21:53:05.690 回答