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 标志,则相反为 true - 在执行初始值设定项时,输入张量不得绑定,但在执行运算符本身时必须绑定。

所有作为输入绑定的缓冲区都必须具有堆类型 D3D12_HEAP_TYPE_DEFAULT,除非设置了 DML_TENSOR_FLAG_OWNED_BY_DML 标志。 如果为作为初始值设定项输入绑定的张量设置了 DML_TENSOR_FLAG_OWNED_BY_DML ,则缓冲区的堆类型可以是 D3D12_HEAP_TYPE_DEFAULTD3D12_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
Library DirectML.lib
DLL DirectML.dll

请参阅

DirectML 中的绑定

IDMLBindingTable