Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Forme e layout

Il proto Shape XLA ( xla_data.proto ) descrive il rango, la dimensione e il tipo di dati di un array N-dimensionale ( array in breve).

Terminologia, notazione e convenzioni

  • Il rango di un array è uguale al numero di dimensioni. Il vero rango di un array è il numero di dimensioni che hanno una dimensione maggiore di 1.

  • Le dimensioni sono numerate da 0 a N-1 per una matrice dimensionale N I numeri di dimensione sono etichette arbitrarie per comodità. L'ordine di questi numeri di dimensione non implica un particolare ordinamento minore / maggiore nel layout della forma. Il layout è determinato dal protocollo Layout .

  • Per convenzione, le dimensioni sono elencate in ordine crescente di numero dimensione. Ad esempio, per un array tridimensionale di dimensione [A x B x C] , la dimensione 0 ha la dimensione A , la dimensione 1 ha la dimensione B e la dimensione 2 ha la dimensione C

    Alcune utility in XLA supportano anche l'indicizzazione negativa, in modo simile a Python; la dimensione -1 è l'ultima dimensione (equivalente a N-1 per una matrice N dimensionale). Ad esempio, per l'array tridimensionale sopra descritto, la dimensione -1 ha dimensione C , la dimensione -2 ha dimensione B e così via.

  • Le matrici a due, tre e quattro dimensioni spesso hanno lettere specifiche associate alle dimensioni. Ad esempio, per un array 2D:

    • dimensione 0: y
    • dimensione 1: x

    Per un array 3D:

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

    Per un array 4D:

    • dimensione 0: p
    • dimensione 1: z
    • dimensione 2: y
    • dimensione 3: x
  • Le funzioni nell'API XLA che accettano dimensioni lo fanno in ordine crescente di numero dimensione. Corrisponde all'ordinamento utilizzato quando si passano le dimensioni come initializer_list ; per esempio

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

    Creerà una forma la cui matrice delle dimensioni della quota è costituita dalla sequenza [A, B, C, D] .

disposizione

Il proto Layout descrive come un array è rappresentato in memoria. Il proto Layout include i seguenti campi:

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

Ordinamento di dimensioni da minore a maggiore

L'unico campo obbligatorio è minor_to_major . Questo campo descrive l'ordinamento da minore a maggiore delle dimensioni all'interno di una forma. I valori in minor_to_major sono un ordinamento delle dimensioni della matrice (da 0 a N-1 per una matrice N dimensionale) con il primo valore che è la dimensione più piccola fino all'ultimo valore che è la dimensione maggiore. La dimensione più piccola è la dimensione che cambia più rapidamente quando si passa attraverso gli elementi dell'array disposti nella memoria lineare.

Ad esempio, considera il seguente array 2D di dimensioni [2 x 3] :

 a b c
d e f
 

Qui la dimensione 0 è la dimensione 2 e la dimensione 1 è la dimensione 3. Se il campo minor_to_major nel layout è [0, 1] dimensione 0 è la dimensione più piccola e la dimensione 1 è la dimensione più grande. Ciò corrisponde al seguente layout nella memoria lineare:

 a d b e c f
 

Questo ordine di dimensioni da minore a maggiore compreso tra 0 e N-1 è simile a quello della colonna maggiore (al grado 2). Supponendo un ordinamento monotonico di dimensioni, un altro nome che potremmo usare per riferirci a questo layout nel codice è semplicemente "dim 0 è minore".

D'altra parte, se il campo minor_to_major nel layout è [1, 0] il layout nella memoria lineare è:

 a b c d e f
 

Un ordine di dimensioni da minore a maggiore di N-1 fino a 0 per una matrice dimensionale N è simile alla fila maggiore (al grado 2). Supponendo un ordinamento monotonico di dimensioni, un altro nome che potremmo usare per riferirci a questo layout nel codice è semplicemente "dim 0 is major".

Ordinamento da minore a maggiore predefinito

Il layout predefinito per le forme appena create è "L'ordine delle dimensioni è maggiore-minore" (simile alla riga maggiore al grado 2).

Imbottitura

Il riempimento è definito nei campi opzionali padded_dimensions e padding_value . Il campo padded_dimensions descrive le dimensioni (larghezze) a cui è riempita ogni dimensione. Se presente, il numero di elementi in padded_dimensions deve essere uguale al rango della forma.

Ad esempio, dato l'array [2 x 3] definito sopra, se padded_dimensions è [3, 5] dimensione 0 viene riempita con una larghezza di 3 e la dimensione 1 è riempita con una larghezza di 5. Il layout nella memoria lineare (supponendo un valore di riempimento di 0 e layout della colonna maggiore) è:

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

Ciò equivale al layout del seguente array con lo stesso ordine di dimensioni da minore a maggiore:

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

Indicizzazione in array

La classe IndexUtil in index_util.h fornisce utilità per la conversione tra indici multidimensionali e indici lineari con una forma e un layout. Gli indici multidimensionali includono un indice int64 per ogni dimensione. Gli indici lineari sono un singolo valore int64 che si indicizza nel buffer che int64 l'array. Vedi shape_util.h e layout_util.h nella stessa directory per utilità che semplificano la creazione e la manipolazione di forme e layout.