O proto XLA Shape
( xla_data.proto ) descreve a classificação, tamanho e tipo de dados de uma matriz N-dimensional ( matriz resumida).
Terminologia, notação e convenções
A classificação de uma matriz é igual ao número de dimensões. A verdadeira classificação de uma matriz é o número de dimensões que possuem um tamanho maior que 1.
As dimensões são numeradas de
0
aN-1
para uma matrizN
dimensional. Os números das dimensões são rótulos arbitrários por conveniência. A ordem desses números de dimensão não implica uma ordem secundária / principal particular no layout da forma. O layout é determinado pelo protocoloLayout
.Por convenção, as dimensões são listadas em ordem crescente de número de dimensão. Por exemplo, para uma matriz tridimensional de tamanho
[A x B x C]
, a dimensão 0 tem o tamanhoA
, a dimensão 1 tem o tamanhoB
e a dimensão 2 tem o tamanhoC
Alguns utilitários no XLA também oferecem suporte à indexação negativa, de maneira semelhante ao Python; dimensão -1 é a última dimensão (equivalente a
N-1
para uma matrizN
dimensional). Por exemplo, para a matriz tridimensional descrita acima, a dimensão -1 tem o tamanhoC
, a dimensão -2 tem o tamanhoB
e assim por diante.Matrizes de duas, três e quatro dimensões costumam ter letras específicas associadas às dimensões. Por exemplo, para uma matriz 2D:
- dimensão 0:
y
- dimensão 1:
x
Para uma matriz 3D:
- dimensão 0:
z
- dimensão 1:
y
- dimensão 2:
x
Para um array 4D:
- dimensão 0:
p
- dimensão 1:
z
- dimensão 2:
y
- dimensão 3:
x
- dimensão 0:
As funções na API XLA que assumem dimensões o fazem em ordem crescente de número de dimensão. Isso corresponde à ordem usada ao passar dimensões como uma
initializer_list
; por exemploShapeUtil::MakeShape(F32, {A, B, C, D})
Irá criar uma forma cuja matriz de tamanho de dimensão consiste na sequência
[A, B, C, D]
.
Layout
O protótipo de Layout
descreve como uma matriz é representada na memória. O protótipo de Layout
inclui os seguintes campos:
message Layout {
repeated int64 minor_to_major = 1;
repeated int64 padded_dimensions = 2;
optional PaddingValue padding_value = 3;
}
Ordem de dimensão menor para maior
O único campo obrigatório é minor_to_major
. Este campo descreve a ordem de menor para maior das dimensões em uma forma. Os valores em minor_to_major
são uma ordenação das dimensões da matriz ( 0
a N-1
para uma matriz N
dimensional) com o primeiro valor sendo a dimensão menor até o último valor, que é a dimensão maior. A dimensão menor é a dimensão que muda mais rapidamente ao percorrer os elementos da matriz dispostos na memória linear.
Por exemplo, considere a seguinte matriz 2D de tamanho [2 x 3]
:
a b c
d e f
Aqui, a dimensão 0
é o tamanho 2 e a dimensão 1
é o tamanho 3. Se o campo minor_to_major
no layout for [0, 1]
, a dimensão 0
é a dimensão mais secundária e a dimensão 1
é a dimensão mais principal. Isso corresponde ao seguinte layout na memória linear:
a d b e c f
Essa ordem de dimensão menor a maior de 0
a N-1
é semelhante à coluna maior (no posto 2). Assumindo uma ordem monotônica de dimensões, outro nome que podemos usar para nos referir a esse layout no código é simplesmente "dim 0 é menor".
Por outro lado, se o campo minor_to_major
no layout for [1, 0]
então o layout na memória linear é:
a b c d e f
Uma ordem de dimensão menor para maior de N-1
até 0
para uma matriz N
dimensional é semelhante à linha maior (no posto 2). Assumindo uma ordem monotônica de dimensões, outro nome que podemos usar para nos referir a esse layout no código é simplesmente "dim 0 é maior".
Ordenação padrão de menor para maior
O layout padrão para as formas recém-criadas é "a ordem das dimensões é maior para menor" (semelhante à linha principal na classificação 2).
Preenchimento
O preenchimento é definido nos campos opcionais padded_dimensions
e padding_value
. O campo padded_dimensions
descreve os tamanhos (larguras) para os quais cada dimensão é preenchida. Se estiver presente, o número de elementos em padded_dimensions
deve ser igual à classificação da forma.
Por exemplo, dada a matriz [2 x 3]
definida acima, se padded_dimensions
for [3, 5]
então a dimensão 0 é preenchida com uma largura de 3 e a dimensão 1 é preenchida com uma largura de 5. O layout na memória linear (assumindo um valor de preenchimento de 0 e layout principal da coluna) é:
a d 0 b e 0 c f 0 0 0 0 0 0 0
Isso é equivalente ao layout da seguinte matriz com a mesma ordem de dimensão menor para maior:
a b c 0 0
d e f 0 0
0 0 0 0 0
Indexando em matrizes
A classe IndexUtil
em index_util.h fornece utilitários para converter entre índices multidimensionais e índices lineares dados uma forma e layout. Os índices multidimensionais incluem um índice int64
para cada dimensão. Índices lineares são um único valor int64
que indexa no buffer que contém a matriz. Veja shape_util.h
e layout_util.h
no mesmo diretório para utilitários que simplificam a criação e manipulação de formas e layouts.