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


структура 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

Тип: DML_TENSOR_DATA_TYPE

Тип значений в тензоре.

Flags

Тип: DML_TENSOR_FLAGS

Задает дополнительные параметры для тензора.

DimensionCount

Тип: UINT

Количество измерений тензора. Этот элемент определяет размер массивов Sizes и Strides (если он указан). В DirectML число измерений может варьироваться от 1 до 8 в зависимости от оператора . Большинство операторов поддерживают по крайней мере 4 измерения.

Sizes

Тип: const UINT*

Размер (в элементах) каждого измерения в тензоре. Указание нулевого размера в любом измерении недопустимо и приведет к ошибке. Для операторов, где оси имеют семантическое значение (например, пакет, канал, глубина, высота, ширина), член Sizes всегда указывается в порядке {N, C, H, W}, если DimensionCount равно 4, и {N, C, D, H, W}, если DimensionCount равен 5. В противном случае измерения, как правило, не имеют особого значения.

Strides

Тип: const UINT*

Необязательный элемент. Определяет количество элементов (а не байтов) для линейного прохода для достижения следующего элемента в этом измерении. Например, шаг 5 в измерении 1 означает, что расстояние между элементами (n) и (n+1) в этом измерении составляет 5 элементов при линейном обходе буфера. Для операторов, в которых оси имеют семантическое значение (например, пакет, канал, глубина, высота, ширина), член Strides всегда указывается в порядке {N, C, H, W}, если DimensionCount равно 4, и {N, C, D, H, W}, если DimensionCount равен 5.

Шаги можно использовать для передачи данных (путем указания шага 0), а также заполнения (например, с помощью шага, превышающего физический размер строки, чтобы заполнить конец строки).

Если значение Strides не указано, каждое измерение в тензоре считается непрерывно упакованным без дополнительного заполнения.

TotalTensorSizeInBytes

Тип: UINT64

Определяет минимальный размер в байтах для буфера, который будет содержать этот тензор. Значение TotalTensorSizeInBytes должно быть не меньше минимального подразумеваемого размера, учитывая размеры, шаги и тип данных тензора. Минимальный подразумеваемый размер можно вычислить, вызвав бесплатную служебную функцию DMLCalcBufferTensorSize .

Предоставление значения TotalTensorSizeInBytes , превышающего минимальный неявный размер, может обеспечить дополнительную оптимизацию, позволяя DirectML проверять границы в некоторых случаях, если TotalTensorSizeInBytes определяет достаточное заполнение за пределами конца данных тензора.

При привязке этого тензора размер буферного диапазона должен быть по крайней мере таким же, как TotalTensorSizeInBytes. Для выходных тензоров это дополнительно дает возможность DirectML записывать данные в любую память в пределах TotalTensorSizeInBytes. То есть приложение не должно предполагать, что DirectML сохранит все байты заполнения внутри выходных тензоров, которые находятся внутри TotalTensorSizeInBytes.

Общий размер тензора буфера не может превышать (2^32–1) элементов, например 16 ГБ для FLOAT32 тензора.

GuaranteedBaseOffsetAlignment

Тип: UINT

Необязательный элемент. Определяет минимальное гарантированное выравнивание в байтах для базового смещения диапазона буфера, который будет содержать этот тензор, или 0, чтобы не обеспечить минимальное гарантированное выравнивание. Если указано значение, это значение должно быть двумя, по крайней мере равными размеру элемента.

При привязке этого тензора смещение в байтах диапазона буфера от начала буфера должно быть кратно значению GuaranteedBaseOffsetAlignment, если указано.

Тензоры буфера всегда имеют минимальное выравнивание в 16 байт. Однако предоставление большего значения для GuaranteedBaseOffsetAlignment может позволить DirectML достичь более высокой производительности, так как большее выравнивание позволяет использовать векторизованные инструкции по загрузке и хранилищу.

Хотя этот элемент является необязательным, для оптимальной производительности рекомендуется выровнять тензоры с границами в 32 байта или более, если это возможно.

Требования

   
Верхняя часть directml.h

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

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