DML_BUFFER_TENSOR_DESC結構 (directml.h)
描述將儲存在 Direct3D 12 緩衝區資源的張量。 對應的張量類型 DML_TENSOR_TYPE_BUFFER,且對應的系結類型 DML_BINDING_TYPE_BUFFER。
語法
struct DML_BUFFER_TENSOR_DESC {
DML_TENSOR_DATA_TYPE DataType;
DML_TENSOR_FLAGS Flags;
UINT DimensionCount;
const UINT *Sizes;
const UINT *Strides;
UINT64 TotalTensorSizeInBytes;
UINT GuaranteedBaseOffsetAlignment;
};
成員
DataType
張量中的值型別。
Flags
類型: DML_TENSOR_FLAGS
指定張量的其他選項。
DimensionCount
類型: UINT
張量維度的數目。 如果提供) ,這個成員會決定 size 和 Strides 陣列的大小 (。 在 DirectML 中,維度計數的範圍可能從 1 到 8,視 運算子而定。 大部分運算子至少支援 4 個維度。
Sizes
類型:const UINT*
張量中每個維度的大小,以元素為單位。 在任何維度中指定零的大小無效,並會導致錯誤。 對於軸具有語意意義的運算子 (,例如批次、通道、深度、高度、寬度) ,如果DimensionCount 為 4,則大小成員一律會以 {N、C、H、W} 的順序指定,如果DimensionCount為 4,則為 {N、C、D、H、W}。 否則,維度通常沒有任何特定意義。
Strides
類型:const UINT*
選擇性。 決定 (不是位元組數,) 以線性方式周遊,以到達該維度中的下一個專案。 例如,維度 1 中的 5 個間距表示線上性周遊緩衝區時,該維度中元素之間的距離 (n) 和 (n+1) 為 5 個元素。 對於軸具有語意意義 (的運算子,例如批次、通道、深度、高度、寬度) ,如果DimensionCount為 4,則一律會以 {N、C、H、W} 的順序指定Strides成員,如果DimensionCount為 4,則為 {N、C、D、H、W}。
跨階 可用來表示廣播 (,方法是指定 0 個) 的寬限以及填補 (,例如使用大於資料列實體大小的步幅來填補資料列的結尾) 。
如果未指定 Strides ,則張量中的每個維度都會被視為連續封裝,而不會有額外的邊框間距。
TotalTensorSizeInBytes
類型: UINT64
為將包含這個張量的緩衝區定義位元組大小下限。 TotalTensorSizeInBytes 必須至少與根據張量的大小、步進和資料類型,最小隱含大小相同。 您可以呼叫 DMLCalcBufferTensorSize 公用程式免費函式來計算隱含大小下限。
提供大於最小隱含大小的 TotalTensorSizeInBytes ,可能會允許 DirectML 在某些情況下進行滑動界限檢查,如果 TotalTensorSizeInBytes 定義超出張量資料結尾的足夠填補,可能會啟用額外的優化。
系結此張量時,緩衝區範圍的大小必須至少與 TotalTensorSizeInBytes相同。 對於輸出張量,這有額外的效果,可讓 DirectML 寫入 TotalTensorSizeInBytes中的任何記憶體。 也就是說,您的應用程式不得假設 DirectML 會在 TotalTensorSizeInBytes內的輸出張量內保留任何填補位元組。
緩衝區張量的大小總計不能超過 (2^32 - 1 個) 元素,例如, FLOAT32 張量為 16GB。
GuaranteedBaseOffsetAlignment
類型: UINT
選擇性。 針對將包含此張量或 0 的緩衝區範圍基底位移,以位元組為單位定義最小保證的對齊方式,或 0 以提供不保證的最小對齊方式。 如果指定,這個值必須是至少大於元素大小的兩個乘冪。
系結此張量時,如果提供,緩衝區開頭的緩衝區範圍位元組位移必須是 GuaranteedBaseOffsetAlignment的倍數。
緩衝區張量一律有 16 個位元組的最小對齊方式。 不過,為 GuaranteedBaseOffsetAlignment 提供較大的值可能會讓 DirectML 達到更好的效能,因為較大的對齊方式可讓您使用向量化載入/存放區指令。
雖然這個成員是選擇性的,但為了達到最佳效能,我們建議您盡可能將張量對齊 32 個位元組以上的界限。
規格需求
標頭 | directml.h |