MCDM 体系结构

本文介绍 Microsoft 计算驱动程序模型 (MCDM) 体系结构概念。 MCDM 驱动程序(或仅限计算的驱动程序)既具有内核模式驱动程序 (.sys驱动程序 ) ,又具有用户模式动态链接库 (DLL) 。

另请参阅:

命令队列

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

上下文

上下文是驱动程序提交的计算工作队列,该队列面向具有特定于实例状态的引擎。 计算工作表示为 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 缓冲区 中,这些更改稍后会在适当时间提交到相应的引擎。