Поделиться через


Метод 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_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 , содержащий описания привязываемых ресурсов тензора.

Возвращаемое значение

None

Remarks

Примеры опасности привязки

В приведенных ниже примерах прямоугольники представляют ресурс буфера, на который ссылается по крайней мере одна привязка в таблице привязки. Каждая строка указывает диапазон байтов, которые могут быть прочитаны (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
Header directml.h
Библиотека DirectML.lib
DLL DirectML.dll

См. также раздел

Привязывание в DirectML

IDMLBindingTable