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 屏障。

這個方法不會保存傳入之任何介面的參考。 您必須負責確保 IDMLDispatchable 物件在 GPU 上完成執行之前,不會釋放所有分派。

語法

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
程式庫 DirectML.lib
Dll DirectML.dll

另請參閱

在 DirectML 中繫結

IDMLCommandRecorder