IDMLBindingTable::BindInputs 方法 (directml.h)
將一組資源系結為輸入張量。
如果編譯運算子的系結,系結數目必須完全符合運算子的輸入數目,包括選擇性張量。 這可以透過用來建立運算子的運算子描述來決定。 如果提供太多或太少的系結,就會發生裝置移除。 針對選擇性張量,您可以使用 DML_BINDING_TYPE_NONE 來指定「沒有系結」。 否則,系結類型必須符合建立運算子時的張量類型。
對於運算子初始化運算式,輸入系結必須是類型 DML_BINDING_TYPE_BUFFER_ARRAY ,每個運算子要初始化一個輸入系結,以您在建立或重設初始化運算式期間指定運算子的順序提供。 每個緩衝區陣列的大小應該等於其對應運算子要初始化的輸入數目。 具有 DML_TENSOR_FLAG_OWNED_BY_DML 旗標集的輸入張量應該在初始化期間系結,否則應該不會針對該張量系結任何內容。 如果沒有要系結為初始化運算子 (的輸入,則 DML_TENSOR_FLAG_OWNED_BY_DML旗標 設定) 沒有張量,則您可以提供 nullptr
或空 的DML_BUFFER_ARRAY_BINDING 來表示「沒有系結」。
若要解除系結所有輸入資源,請提供rangeCount為 0,並為系結提供 的值 nullptr
。
如果輸入張量已設定 DML_TENSOR_FLAG_OWNED_BY_DML 旗標,則只有在執行運算子初始化運算式時,才會系結它。 否則,如果未設定 DML_TENSOR_FLAG_OWNED_BY_DML 旗標,則相反地,輸入張量在執行初始化運算式時不得系結,但在執行運算子本身時必須系結。
系結為輸入的所有緩衝區都必須有堆積類型 D3D12_HEAP_TYPE_DEFAULT,除非設定 DML_TENSOR_FLAG_OWNED_BY_DML 旗標。 如果 DML_TENSOR_FLAG_OWNED_BY_DML 是針對系結為初始化運算式輸入的張量設定,則緩衝區的堆積類型可能是 D3D12_HEAP_TYPE_DEFAULT 或 D3D12_HEAP_TYPE_UPLOAD。
在某些情況下,允許多個系結參考相同的 ID3D12Resource ;不過,當操作員同時讀取和寫入資源的相同區域時,您應該小心。 當一對系結參考相同的 ID3D12Resource,而且至少涉及其中一個系結,而且緩衝區區域與至少一個位元組) (重迭時,就可能發生系結危險。 從 DirectML 1.7.0 起,系結危險會使用下列規則進行驗證:
- 進行初始化的系結時,輸入系結永遠無法參考與輸出系結相同的資源—輸入會複製到輸出資源 (未來的持續性資源來執行) ,而複製可能需要資源狀態轉換。
- 執行系結時,輸入系結可能會參考與輸出系結相同的資源;不過,只有在區域相同 且 運算子支援就地執行時,個別的系結範圍才能交集。
- 如果存在,持續性系結不得與任何輸出系結或暫存系結交集。
- 如果存在,暫存系結不得與任何輸入系結、輸出系結或持續性系結相交。
上述規則假設兩個資源不會將堆積的相同區域別名,因此在使用放置或保留的資源時,需要額外注意。
語法
void BindInputs(
UINT bindingCount,
[in, optional] const DML_BINDING_DESC *bindings
);
參數
bindingCount
類型: UINT
如果提供系結陣列) ,此參數會決定系 結 陣列的大小 (。
[in, optional] bindings
類型:const DML_BINDING_DESC*
DML_BINDING_DESC常數 陣列的選擇性 指標,其中包含要系結之張量資源的描述。
傳回值
無
備註
系結危險範例
在下列範例中,矩形代表系結資料表中至少一個系結所參考的緩衝區資源。 每個資料列都指出具名系結可能會讀取 (R) 或寫入 (W) 的位元組範圍。 所有範例都假設資源不會共用相同的實體記憶體。
範例 1
此範例示範參考不同資源的輸入和輸出系結。 參考不同資源的一對系結永遠不會造成危險,因此這一律是有效的系結。
Resource A Resource B
+---------------+ +---------------+
Input 0: |RRRRRRRRRRRRRRR| | |
Output 0: | | |WWWWWWWWWWWWWWW|
+---------------+ +---------------+
範例 2
此範例示範參考相同資源不同區域的輸入和輸出系結。 在系結執行時,具有相同資源非重迭區域的一對系結並不是危險。 這是系結執行時的有效系結,但在初始化系結時無效。
Resource A
+---------------+
Input 0: |RRRRRRR |
Output 0: | WWWWWWWW|
+---------------+
範例 3
此範例顯示兩個重迭範圍的輸入系結。 一對唯讀系結 (輸入系結和永續性系結) 永遠不會造成危險,而不論任何緩衝區區域交集為何,這一定是有效的系結。
Resource A Resource B
+---------------+ +---------------+
Input 0: |RRRRRRRRR | | |
Input 1: | RRRRRRRRR| | |
Output 0: | | |WWWWWWWWWWWWWWW|
+---------------+ +---------------+
範例 4
此範例示範具有相同區域的輸入和輸出系結。 只有當系結的運算子支援就地執行且系結用於執行時,這個系結才有效。
Resource A
+---------------+
Input 0: |RRRRRRRRRRRRRRR|
Output 0: |WWWWWWWWWWWWWWW|
+---------------+
範例 5
不論運算子的就地執行支援為何,下列系結都無效,因為它牽涉到一對具有不相同區域重迭區域的系結。
Resource A
+---------------+
Input 0: |RRRRRRRRRRRRR |
Output 0: | WWWWWWWWWWW|
+---------------+
規格需求
規格需求
目標平台 | Windows |
標頭 | directml.h |
程式庫 | DirectML.lib |
Dll | DirectML.dll |