IDMLCommandRecorder::RecordDispatch 方法 (directml.h)

记录 (运算符初始值设定项或编译的运算符) 到命令列表中的可调度对象的执行。

此方法不会将执行提交到 GPU;它只是将其记录到命令列表中。 你负责关闭命令列表并将其提交到 Direct3D 12 命令队列。

在 GPU 上执行此调用之前,绑定的所有资源必须处于 D3D12_RESOURCE_STATE_UNORDERED_ACCESS 状态,或可隐式提升到 D3D12_RESOURCE_STATE_UNORDERED_ACCESS的状态,例如 D3D12_RESOURCE_STATE_COMMON。 此调用完成后,资源将保持 D3D12_RESOURCE_STATE_UNORDERED_ACCESS 状态。 只有在执行运算符初始值设定项时以及为一个或多个张量设置了 DML_TENSOR_FLAG_OWNED_BY_DML 标志时绑定的上传堆例外。 在这种情况下,为输入绑定的任何上传堆必须处于 D3D12_RESOURCE_STATE_GENERIC_READ 状态,并会根据所有上传堆的要求保持该状态。

此方法重置命令列表中的以下状态。

  • 计算根签名
  • 管道状态
不会修改任何其他命令列表状态。

尽管此方法采用表示要绑定到管道的资源的绑定表,但它不会设置包含描述符本身的描述符堆。 因此,应用程序负责调用 ID3D12GraphicsCommandList::SetDescriptorHeaps 以将正确的描述符堆绑定到管道。

如果编译运算符时未设置 DML_EXECUTION_FLAG_DESCRIPTORS_VOLATILE,则在调用 RecordDispatch 之前,必须在绑定表中设置所有绑定,否则行为是不确定的。 否则,如果设置了 _DESCRIPTORS_VOLATILE 标志,则资源的绑定可能会延迟,直到将 Direct3D 12 命令列表提交到命令队列以供执行。

此方法在逻辑上类似于对 ID3D12GraphicsCommandList::D ispatch 的调用。 在这种情况下,需要施加无序访问视图 (UAV) 屏障,以确保调度之间存在数据依赖关系时顺序正确。 此方法不会在输入和输出资源中插入 UAV 屏障。 应用程序必须确保当任何输入的内容依赖于上游调度时在这些输入中执行正确的 UAV 屏障,并在下游调度依赖于这任何输出时在这些输出中执行正确的 UAV 屏障。

此方法不保存对传入的任何接口的引用。 你有责任确保 IDMLDispatchable 对象在 GPU 上完成执行之前不会释放 IDMLDispatchable 对象。

语法

void RecordDispatch(
  ID3D12CommandList *commandList,
  IDMLDispatchable  *dispatchable,
  IDMLBindingTable  *bindings
);

参数

commandList

类型: ID3D12CommandList*

指向 ID3D12CommandList 接口的指针,该接口表示要记录执行操作的命令列表。 命令列表必须打开,并且必须具有 类型D3D12_COMMAND_LIST_TYPE_DIRECTD3D12_COMMAND_LIST_TYPE_COMPUTE

dispatchable

类型: IDMLDispatchable*

指向 IDMLDispatchable 接口的指针,该接口表示对象 (运算符初始值设定项,或已编译的运算符) ,其执行将记录到命令列表中。

bindings

类型: IDMLBindingTable*

指向 IDMLBindingTable 接口的指针,该接口表示要用于执行可调度对象的绑定。 如果未设置 DML_EXECUTION_FLAG_DESCRIPTORS_VOLATILE 标志,则必须填写所有必需的绑定,否则将导致错误。

返回值

要求

要求
目标平台 Windows
标头 directml.h
Library DirectML.lib
DLL DirectML.dll

另请参阅

DirectML 中的绑定

IDMLCommandRecorder