Partager via


structure DML_BUFFER_TENSOR_DESC (directml.h)

Décrit un tenseur qui sera stocké dans une ressource de mémoire tampon Direct3D 12. Le type tensoriel correspondant est DML_TENSOR_TYPE_BUFFER et le type de liaison correspondant est DML_BINDING_TYPE_BUFFER.

Syntaxe

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;
};

Membres

DataType

Type : DML_TENSOR_DATA_TYPE

Type des valeurs dans le tenseur.

Flags

Type : DML_TENSOR_FLAGS

Spécifie des options supplémentaires pour le tenseur.

DimensionCount

Type : UINT

Nombre de dimensions du tenseur. Ce membre détermine la taille des tableaux Sizes et Strides (le cas échéant). Dans DirectML, le nombre de dimensions peut aller de 1 à 8, selon l’opérateur. La plupart des opérateurs prennent en charge au moins 4 dimensions.

Sizes

Type : const UINT*

Taille, en éléments, de chaque dimension dans le tenseur. La spécification d’une taille de zéro dans une dimension n’est pas valide et génère une erreur. Pour les opérateurs où les axes ont une signification sémantique (par exemple, lot, canal, profondeur, hauteur, largeur), le membre Sizes est toujours spécifié dans l’ordre {N, C, H, W} si DimensionCount a la valeur 4, et {N, C, D, H, W} si DimensionCount a la valeur 5. Sinon, les dimensions n’ont généralement pas de signification particulière.

Strides

Type : const UINT*

facultatif. Détermine le nombre d’éléments (et non d’octets) à parcourir linéairement afin d’atteindre l’élément suivant dans cette dimension. Par exemple, une foulée de 5 dans la dimension 1 signifie que la distance entre les éléments (n) et (n+1) dans cette dimension est de 5 éléments lors de la traversée linéaire de la mémoire tampon. Pour les opérateurs pour lesquels les axes ont une signification sémantique (par exemple, lot, canal, profondeur, hauteur, largeur), le membre Strides est toujours spécifié dans l’ordre {N, C, H, W} si DimensionCount a la valeur 4 et {N, C, D, H, W} si DimensionCount a la valeur 5.

Les pas peuvent être utilisés pour exprimer la diffusion (en spécifiant une foulée de 0) ainsi qu’un remplissage (par exemple, en utilisant une foulée supérieure à la taille physique d’une ligne, pour compléter la fin d’une ligne).

Si Strides n’est pas spécifié, chaque dimension du tenseur est considérée comme étant contiguë, sans remplissage supplémentaire.

TotalTensorSizeInBytes

Type : UINT64

Définit une taille minimale en octets pour la mémoire tampon qui contiendra ce tenseur. TotalTensorSizeInBytes doit être au moins aussi grand que la taille minimale implicite en fonction des tailles, des foulées et du type de données du tenseur. Vous pouvez calculer la taille minimale implicite en appelant la fonction libre de l’utilitaire DMLCalcBufferTensorSize .

La fourniture d’un TotalTensorSizeInBytes supérieur à la taille minimale implicite peut permettre des optimisations supplémentaires en permettant à DirectML d’étalement les limites de vérification dans certains cas si le TotalTensorSizeInBytes définit un remplissage suffisant au-delà de la fin des données tensoriels.

Lors de la liaison de ce tenseur, la taille de la plage de mémoires tampons doit être au moins aussi grande que totalTensorSizeInBytes. Pour les tenseurs de sortie, cela a pour effet supplémentaire de permettre à DirectML d’écrire dans n’importe quelle mémoire dans totalTensorSizeInBytes. Autrement dit, votre application ne doit pas supposer que DirectML conservera les octets de remplissage à l’intérieur des tenseurs de sortie qui se trouvent à l’intérieur de TotalTensorSizeInBytes.

La taille totale d’un tenseur de mémoire tampon ne peut pas dépasser (2^32 - 1) éléments, par exemple 16 Go pour un tenseur FLOAT32 .

GuaranteedBaseOffsetAlignment

Type : UINT

facultatif. Définit un alignement minimum garanti en octets pour le décalage de base de la plage de mémoires tampons qui contiendra ce tenseur, ou 0 pour ne fournir aucun alignement minimum garanti. Si elle est spécifiée, cette valeur doit être une puissance de deux qui est au moins aussi grande que la taille de l’élément.

Lors de la liaison de ce tenseur, le décalage en octets de la plage de mémoires tampons à partir du début de la mémoire tampon doit être un multiple de GuaranteedBaseOffsetAlignment, s’il est fourni.

Les tenseurs de mémoire tampon ont toujours un alignement minimal de 16 octets. Toutefois, le fait de fournir une valeur plus élevée à GuaranteedBaseOffsetAlignment peut permettre à DirectML d’obtenir de meilleures performances, car un alignement plus large permet d’utiliser des instructions de chargement/de magasin vectorisées.

Bien que ce membre soit facultatif, nous vous recommandons d’aligner les tenseurs sur des limites de 32 octets ou plus, si possible.

Configuration requise

   
En-tête directml.h

Voir aussi

Liaison dans DirectML