Formes et mise en page

Le proto de Shape XLA ( xla_data.proto ) décrit le rang, la taille et le type de données d'un tableau à N dimensions ( tableau en bref).

Terminologie, notation et conventions

  • Le rang d'un tableau est égal au nombre de dimensions. Le vrai rang d'un tableau est le nombre de dimensions qui ont une taille supérieure à 1.

  • Les dimensions sont numérotées de 0 à N-1 pour un tableau à N dimensions. Les numéros de dimension sont des étiquettes arbitraires pour plus de commodité. L'ordre de ces numéros de dimension n'implique pas un ordre mineur / majeur particulier dans la disposition de la forme. La mise en page est déterminée par le proto de Layout .

  • Par convention, les dimensions sont répertoriées par ordre croissant de numéro de dimension. Par exemple, pour un tableau à trois dimensions de taille [A x B x C] , la dimension 0 a la taille A , la dimension 1 a la taille B et la dimension 2 a la taille C

    Certains utilitaires de XLA prennent également en charge l'indexation négative, de la même manière que Python; dimension -1 est la dernière dimension (équivalente à N-1 pour un tableau à N dimensions). Par exemple, pour le tableau à trois dimensions décrit ci-dessus, la dimension -1 a la taille C , la dimension -2 a la taille B et ainsi de suite.

  • Les tableaux à deux, trois et quatre dimensions ont souvent des lettres spécifiques associées à des dimensions. Par exemple, pour un tableau 2D:

    • dimension 0: y
    • dimension 1: x

    Pour un tableau 3D:

    • dimension 0: z
    • dimension 1: y
    • dimension 2: x

    Pour une baie 4D:

    • dimension 0: p
    • dimension 1: z
    • dimension 2: y
    • dimension 3: x
  • Les fonctions de l'API XLA qui prennent des dimensions le font par ordre croissant de numéro de dimension. Cela correspond à l'ordre utilisé lors de la transmission des dimensions en tant que initializer_list ; par exemple

    ShapeUtil::MakeShape(F32, {A, B, C, D})

    Crée une forme dont le tableau de taille de dimension se compose de la séquence [A, B, C, D] .

Mise en page

Le proto Layout décrit comment un tableau est représenté en mémoire. Le proto de Layout comprend les champs suivants:

message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}

Ordre des dimensions mineures à majeures

Le seul champ obligatoire est minor_to_major . Ce champ décrit l'ordre mineur à majeur des dimensions dans une forme. Les valeurs de minor_to_major sont un ordre des dimensions du tableau ( 0 à N-1 pour un tableau à N dimensions), la première valeur étant la dimension la plus mineure jusqu'à la dernière valeur qui est la dimension la plus importante. La dimension la plus mineure est la dimension qui change le plus rapidement lorsque l'on parcourt les éléments du tableau disposés en mémoire linéaire.

Par exemple, considérons le tableau 2D suivant de taille [2 x 3] :

a b c
d e f

Ici, la dimension 0 est la taille 2 et la dimension 1 est la taille 3. Si le champ minor_to_major dans la mise en page est [0, 1] alors la dimension 0 est la dimension la plus mineure et la dimension 1 est la dimension la plus importante. Cela correspond à la disposition suivante en mémoire linéaire:

a d b e c f

Cet ordre de dimension mineure à majeure de 0 à N-1 s'apparente à la colonne principale (au rang 2). En supposant un ordre monotone des dimensions, un autre nom que nous pouvons utiliser pour faire référence à cette disposition dans le code est simplement "dim 0 est mineur".

D'un autre côté, si le champ minor_to_major dans le layout est [1, 0] alors le layout en mémoire linéaire est:

a b c d e f

Un ordre de dimension mineur à majeur de N-1 jusqu'à 0 pour un tableau à N dimensions s'apparente à une ligne majeure (au rang 2). En supposant un ordre monotone des dimensions, un autre nom que nous pouvons utiliser pour faire référence à cette disposition dans le code est simplement "dim 0 is major".

Commande par défaut de mineur à majeur

La disposition par défaut pour les formes nouvellement créées est «l'ordre des dimensions est majeur à mineur» (semblable à la ligne principale au rang 2).

Rembourrage

Le remplissage est défini dans les padded_dimensions optionnels padded_dimensions et padding_value . Le champ padded_dimensions décrit les tailles (largeurs) auxquelles chaque dimension est complétée. S'il est présent, le nombre d'éléments dans padded_dimensions doit être égal au rang de la forme.

Par exemple, étant donné le tableau [2 x 3] défini ci-dessus, si padded_dimensions est [3, 5] alors la dimension 0 est complétée à une largeur de 3 et la dimension 1 est complétée à une largeur de 5. La disposition en mémoire linéaire une valeur de remplissage de 0 et une disposition de colonne principale) est:

a d 0 b e 0 c f 0 0 0 0 0 0 0

Cela équivaut à la disposition du tableau suivant avec le même ordre de dimension mineure à majeure:

a b c 0 0
d e f 0 0
0 0 0 0 0

Indexation dans des tableaux

La classe IndexUtil dans index_util.h fournit des utilitaires pour la conversion entre les index multidimensionnels et les index linéaires en fonction d'une forme et d'une disposition. Les index multidimensionnels incluent un index int64 pour chaque dimension. Les indices linéaires sont une seule valeur int64 qui indexe dans le tampon contenant le tableau. Voir shape_util.h et layout_util.h dans le même répertoire pour les utilitaires qui simplifient la création et la manipulation des formes et des mises en page.