Esta página foi traduzida pela API Cloud Translation.
Switch to English

Formas e layout

O protótipo 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 com tamanho maior que 1.

  • As dimensões são numeradas de 0 a N-1 para uma matriz dimensional N Os números das dimensões são etiquetas arbitrárias por conveniência. A ordem desses números de dimensão não implica uma ordem menor / maior específica no layout da forma. O layout é determinado pelo proto Layout .

  • Por convenção, as dimensões são listadas em ordem crescente do número da dimensão. Por exemplo, para uma matriz tridimensional do tamanho [A x B x C] , a dimensão 0 possui o tamanho A , a dimensão 1 possui o tamanho B e a dimensão 2 possui o tamanho C

    Alguns utilitários no XLA também oferecem suporte à indexação negativa, semelhante ao Python; dimensão -1 é a última dimensão (equivalente a N-1 para uma matriz dimensional N ). Por exemplo, para a matriz tridimensional descrita acima, a dimensão -1 tem tamanho C , a dimensão -2 tem tamanho B e assim por diante.

  • Matrizes de duas, três e quatro dimensões geralmente têm 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 uma matriz 4D:

    • dimensão 0: p
    • dimensão 1: z
    • dimensão 2: y
    • dimensão 3: x
  • As funções na API XLA que assumem dimensões o fazem em ordem crescente do número da dimensão. Isso corresponde à ordem usada ao passar dimensões como uma lista de initializer_list ; por exemplo

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

    Criará uma forma cuja matriz de tamanho de dimensão consiste na sequência [A, B, C, D] .

Layout

O protótipo Layout descreve como uma matriz é representada na memória. O proto Layout inclui os seguintes campos:

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

Ordenação 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 ordem das dimensões da matriz ( 0 a N-1 para uma matriz dimensional N ) com o primeiro valor sendo a dimensão mais secundária até o último valor, que é a dimensão mais importante. A dimensão mais pequena é 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 pequena e a dimensão 1 é a dimensão mais importante. Isso corresponde ao seguinte layout na memória linear:

 a d b e c f
 

Essa ordem de dimensão menor para maior, de 0 a N-1 é semelhante à coluna principal (na classificação 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] , o layout na memória linear será:

 a b c d e f
 

Uma ordem de dimensão menor para maior de N-1 até 0 para uma matriz dimensional N é semelhante à maior de linha (na classificação 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 is major".

Pedido menor para maior padrão

O layout padrão para as Formas recém-criadas é "a ordem da dimensão é maior para menor" (semelhante à linha maior na classificação 2).

Preenchimento

O preenchimento é definido nos campos padding_value e padded_dimensions opcionais. O campo padded_dimensions descreve os tamanhos (larguras) nos quais cada dimensão é preenchida. Se presente, o número de elementos nas padded_dimensions deve ser igual à classificação da forma.

Por exemplo, dado o array [2 x 3] definido acima, se padded_dimensions for [3, 5] , a dimensão 0 será preenchida com uma largura de 3 e a dimensão 1 será 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 a conversão entre índices multidimensionais e índices lineares, dada a forma e o 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 layout_util.h no mesmo diretório para utilitários que simplificam a criação e manipulação de formas e layouts.