MCDM 体系结构

Microsoft 计算驱动程序模型 (MCDM) 驱动程序是一个框架,旨在支持 Windows 平台上的高性能计算任务。 它为开发可使用 GPU、NPU 和其他计算资源执行并行处理任务的驱动程序提供了一个标准化接口。 对于需要密集计算能力的应用(如科学模拟、数据分析和机器学习)来说,MCDM 驱动程序是必不可少的。

本文介绍了 MCDM 体系结构的概念。 MCDM 驱动程序或纯计算驱动程序包含内核模式驱动程序(.sys 驱动程序)和用户模式动态链接库 (DLL)。

另请参阅:

命令队列

命令队列是用于提交工作的 DirectCompute 结构。 驱动程序负责创建一个或多个上下文,然后使用这些上下文来执行提交的工作。 驱动程序负责将通过调用其 DDI 表达的工作转化为 DMA 缓冲区,然后提交给上下文用于执行。

Context

上下文是由针对引擎的驱动程序提交的计算工作队列,而该引擎具有特定实例的状态。 计算工作表示为 DMA 缓冲区,这些缓冲区保存在 SW 队列中,等待提交给引擎

SW 队列

提交给上下文执行的 DMA 缓冲区保存在 SW 队列中。 SW 队列的长度只会受到资源的限制。 上下文和其对应的 SW 队列之间存在一对一的关联。 计划程序负责从 SW 队列中移除 DMA 缓冲区,并将缓冲区提交给相应的引擎,后者再将缓冲区放到自己的 HW 队列中。

计划程序

计划程序 由 OS 实现,而驱动程序无法控制此计划。

计划程序负责在目标引擎SW 队列中计划排队工作。 它可确保在所有 SW 队列中公平使用有限的引擎资源,并根据需要抢先执行工作,以确保这种公平性,并确保优先级较高的工作及时完成。

计划程序抢先工作时,它会负责对被抢先的工作进行适当的重新排队。

引擎

引擎会执行必要的操作,以完成以 DMA 缓冲区序列所表示的工作。 每个 DMA 缓冲区都在给定的上下文地址空间中执行。 引擎必须在 DMA 缓冲区执行完毕时发出指示,这些指示必须以接收 DMA 缓冲区的相同顺序发出。

引擎应该能够在 DMA 缓冲区中没有显式或隐式的依赖项的情况下独立向前推进。 如果存在两个或两个以上的引擎,则在安排这些引擎的工作时,应假定每个引擎的工作都能及时进行,并且不会影响其他引擎的工作。

由于 DMA 缓冲区是在给定的地址空间中执行的,因此只有每个引擎都能在不同的地址空间中执行 DMA 缓冲区时,才能支持多个 引擎

驱动程序会决定它报告多少个引擎以及它创建的上下文如何使用这些引擎

HW 队列

引擎将获得一系列 DMA 缓冲区,而这些缓冲区在概念上被置于一个名为 HW 队列的队列中。 目前,该队列最多只能填充两个 DMA 缓冲区条目。 引擎必须按提交顺序完成 DMA 缓冲区

优先

引擎必须具有抢先功能,从而允许中断或取消执行部分完成的 DMA 缓冲区

当要求抢先处理未完成的工作时,引擎必须至少支持完成任何部分完成的 DMA 缓冲区,并取消所有尚未启动的DMA 缓冲区

DMA 缓冲区的完成或抢先指示仍必须按照 DMA 缓冲区的提交顺序来进行。 如果 DMA 缓冲区被抢先,则随后的所有 DMA 缓冲区(当前最多有一个其他缓冲区)也会被抢先。

如果 DMA 缓冲区被部分执行,则驱动程序必须保存足够的信息,以便恢复执行。

DMA 缓冲区

驱动程序将通过调用其 DDI 提交的工作转换为 DMA 缓冲区,然后提交执行。 引擎会执行必要的操作,以完成以 DMA 缓冲区序列所表示的工作。 每个 DMA 缓冲区都在给定的上下文地址空间中执行。 引擎必须在 DMA 缓冲区执行完毕时发出指示,这些指示必须以接收 DMA 缓冲区的相同顺序发出。

地址空间

地址空间用于将虚拟设备地址映射到物理设备地址。 每个主机端进程都会使用一个地址空间

引擎是跨进程的共享资源,因此必须支持地址空间之间的切换,因为 DMA 缓冲区是由不同进程执行的。

仅支持一个地址空间的设备在使用时必须受到限制。 每次只允许一个进程使用该设备。 当一个进程正在使用设备时,其他进程访问设备的所有尝试都将失败。 仅支持单个进程访问的设备称为一次性设备。

地址空间由指向地址空间根页表的单个指针指定。 更改到不同的地址空间只需指定不同的根页表地址。

OS 管理一个地址空间页表。 为了更改页表,OS 会向驱动程序发出请求,要求将这些更改记录到 DMA 缓冲区中,然后在适当的时间提交给相应的引擎。