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} 的顺序指定 Size 成员;如果 DimensionCount 为 5,则始终按 {N、C、D、H、W} 的顺序指定 Size 成员。 否则,维度通常没有特定含义。
Strides
类型: const UINT*
可选。 确定) 线性遍历以达到该维度中的下一个元素 (而不是字节数。 例如,维度 1 中的步幅为 5,表示在以线性方式遍历缓冲区时, (n) 的元素与该维度中 (n+1) 元素之间的距离为 5 个元素。 对于轴具有语义含义 (例如批处理、通道、深度、高度、宽度) 的运算符,如果 DimensionCount 为 4,则始终按 {N, C, H, W} 的顺序指定 Strides 成员;如果 DimensionCount 为 5,则始终按 {N, C, D, H, W} 的顺序指定。
可以使用步幅 来表示广播 (,方法是将步幅指定为 0) 以及填充 (,例如,通过使用大于行的物理大小的步幅来填充行) 的末尾。
如果未指定 Strides ,则张量中的每个维度被视为连续打包,没有额外的填充。
TotalTensorSizeInBytes
类型: UINT64
定义将包含此张量的缓冲区的最小大小(以字节为单位)。 根据张量的大小、步幅和数据类型,TotalTensorSizeInBytes 必须至少与最小隐含大小相同。 可以通过调用 DMLCalcBufferTensorSize 实用工具免费函数来计算最小隐含大小。
如果 TotalTensorSizeInBytes 定义了超出张量数据末尾的足够填充,则提供大于最小隐含大小的 TotalTensorSizeInBytes 可能会允许 DirectML 删除边界检查,从而实现额外的优化。
绑定此张量时,缓冲区范围的大小必须至少与 TotalTensorSizeInBytes 一样大。 对于输出张量,这具有允许 DirectML 写入 TotalTensorSizeInBytes 中的任何内存的额外效果。 也就是说,应用程序不得假定 DirectML 将保留 TotalTensorSizeInBytes 内输出张量内的任何填充字节。
缓冲区张量的总大小不能超过 (2^32 - 1) 元素,例如, FLOAT32 张量为 16GB。
GuaranteedBaseOffsetAlignment
类型: UINT
可选。 为将包含此张量的缓冲区范围的基偏移量定义最小保证对齐方式(以字节为单位),或 0 表示不提供最低保证对齐方式。 如果指定,此值必须是至少与元素大小一样大的 2 幂。
绑定此张量时,缓冲区范围自缓冲区开头的偏移量(以字节为单位)必须是 GuaranteedBaseOffsetAlignment 的倍数(如果提供)。
缓冲区张量始终具有 16 个字节的最小对齐方式。 但是,为 GuaranteedBaseOffsetAlignment 提供更大的值可能允许 DirectML 实现更好的性能,因为更大的对齐方式允许使用矢量化加载/存储指令。
尽管此成员是可选的,但为了获得最佳性能,我们建议尽可能将张量与 32 个字节或更多字节的边界对齐。
要求
标头 | directml.h |