Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Formen und Layout

Das XLA Shape Proto ( xla_data.proto ) beschreibt den Rang, die Größe und den Datentyp eines N-dimensionalen Arrays (kurz Array ).

Terminologie, Notation und Konventionen

  • Der Rang eines Arrays entspricht der Anzahl der Dimensionen. Der wahre Rang eines Arrays ist die Anzahl der Dimensionen, deren Größe größer als 1 ist.

  • Die Dimensionen sind für ein N dimensionales Array von 0 bis N-1 nummeriert. Die Dimensionsnummern sind der Einfachheit halber beliebige Bezeichnungen. Die Reihenfolge dieser Bemaßungsnummern impliziert keine bestimmte Neben- / Hauptreihenfolge im Layout der Form. Das Layout wird vom Layout Proto bestimmt.

  • Konventionell werden Dimensionen in aufsteigender Reihenfolge der Dimensionsnummer aufgelistet. Beispielsweise hat für ein dreidimensionales Array der Größe [A x B x C] Dimension 0 die Größe A , die Dimension 1 die Größe B und die Dimension 2 die Größe C

    Einige Dienstprogramme in XLA unterstützen auch eine negative Indizierung, ähnlich wie Python. Dimension -1 ist die letzte Dimension (entspricht N-1 für ein N dimensionales Array). Beispielsweise hat für das oben beschriebene dreidimensionale Array die Dimension -1 die Größe C , die Dimension -2 die Größe B und so weiter.

  • Zwei-, drei- und vierdimensionale Arrays haben häufig bestimmte Buchstaben, die mit Dimensionen verknüpft sind. Zum Beispiel für ein 2D-Array:

    • Dimension 0: y
    • Dimension 1: x

    Für ein 3D-Array:

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

    Für ein 4D-Array:

    • Dimension 0: p
    • Dimension 1: z
    • Dimension 2: y
    • Dimension 3: x
  • Funktionen in der XLA-API, die Dimensionen annehmen, tun dies in aufsteigender Reihenfolge der Dimensionsnummer. Dies entspricht der Reihenfolge, in der Dimensionen als initializer_list . z.B

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

    Erstellt eine Form, deren Bemaßungsgrößenarray aus der Sequenz [A, B, C, D] .

Layout

Das Layout Proto beschreibt, wie ein Array im Speicher dargestellt wird. Das Layout Proto enthält die folgenden Felder:

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

Reihenfolge der kleinen bis großen Abmessungen

Das einzige erforderliche Feld ist minor_to_major . Dieses Feld beschreibt die Reihenfolge von Moll zu Dur der Dimensionen innerhalb einer Form. Die Werte in minor_to_major sind eine Reihenfolge der Dimensionen des Arrays ( 0 bis N-1 für ein N dimensionales Array), wobei der erste Wert die kleinste Dimension bis zum letzten Wert ist, der die größte Dimension ist. Die kleinste Dimension ist die Dimension, die sich am schnellsten ändert, wenn Sie durch die Elemente des Arrays gehen, die im linearen Speicher angeordnet sind.

Betrachten Sie beispielsweise das folgende 2D-Array der Größe [2 x 3] :

 a b c
d e f
 

Hier ist Dimension 0 Größe 2 und Dimension 1 Größe 3. Wenn das Feld minor_to_major im Layout [0, 1] ist, ist Dimension 0 die kleinste Dimension und Dimension 1 die größte Dimension. Dies entspricht dem folgenden Layout im linearen Speicher:

 a d b e c f
 

Diese Moll-zu-Dur-Dimensionsreihenfolge von 0 bis N-1 ähnelt der Spalte-Dur (auf Rang 2). Unter der Annahme einer monotonen Reihenfolge der Dimensionen ist ein anderer Name, den wir verwenden können, um auf dieses Layout im Code zu verweisen, einfach "dim 0 is minor".

Wenn andererseits das Feld minor_to_major im Layout [1, 0] ist [1, 0] lautet das Layout im linearen Speicher:

 a b c d e f
 

Eine Minor-to-Major-Dimensionsreihenfolge von N-1 bis 0 für ein N dimensionales Array ist ähnlich wie Row-Major (auf Rang 2). Unter der Annahme einer monotonen Reihenfolge der Dimensionen ist ein anderer Name, den wir verwenden können, um auf dieses Layout im Code zu verweisen, einfach "dim 0 is major".

Standardbestellung von Moll zu Dur

Das Standardlayout für neu erstellte Formen lautet "Bemaßungsreihenfolge ist von Dur nach Moll" (ähnlich wie Row-Major auf Rang 2).

Polsterung

Das Auffüllen wird in den optionalen Feldern padded_dimensions und padding_value definiert. Das Feld padded_dimensions beschreibt die Größen (Breiten), auf die jede Dimension aufgefüllt wird. Falls vorhanden, muss die Anzahl der Elemente in padded_dimensions dem Rang der Form entsprechen.

Wenn beispielsweise für das oben definierte Array [2 x 3] padded_dimensions [3, 5] ist, wird Dimension 0 auf eine Breite von 3 und Dimension 1 auf eine Breite von 5 aufgefüllt. Das Layout im linearen Speicher (vorausgesetzt Ein Füllwert von 0 und Spalten-Hauptlayout ist:

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

Dies entspricht dem Layout des folgenden Arrays mit derselben Dimension von Moll zu Major:

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

Indizierung in Arrays

Die Klasse IndexUtil in index_util.h bietet Dienstprogramme zum Konvertieren zwischen mehrdimensionalen Indizes und linearen Indizes bei gegebener Form und Layout. Mehrdimensionale Indizes enthalten einen int64 Index für jede Dimension. Lineare Indizes sind einzelne int64 Werte, die in den Puffer indiziert werden, in dem sich das Array befindet. Unter shape_util.h und layout_util.h im selben Verzeichnis finden Sie Dienstprogramme, die das Erstellen und Bearbeiten von Formen und Layouts vereinfachen.