Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Kształty i układ

Protokół Shape XLA ( xla_data.proto ) opisuje rangę, rozmiar i typ danych tablicy N-wymiarowej (w skrócie tablica ).

Terminologia, notacja i konwencje

  • Pozycja tablicy jest równa liczbie wymiarów. Prawdziwa pozycja tablicy to liczba wymiarów o rozmiarze większym niż 1.

  • Wymiary są numerowane od 0 do N-1 dla tablicy N wymiarowej. Numery wymiarów są dla wygody dowolnymi etykietami. Kolejność tych numerów wymiarów nie implikuje szczególnego mniejszego / większego uporządkowania w układzie kształtu. Układ jest określany przez protokół Layout .

  • Zgodnie z konwencją wymiary są wymienione w kolejności rosnącej według numeru wymiaru. Na przykład dla trójwymiarowej tablicy o rozmiarze [A x B x C] wymiar 0 ma rozmiar A , wymiar 1 ma rozmiar B a wymiar 2 ma rozmiar C

    Niektóre narzędzia w XLA obsługują również indeksowanie ujemne, podobnie jak Python; wymiar -1 to ostatni wymiar (odpowiednik N-1 dla tablicy N wymiarowej). Na przykład dla opisanej powyżej trójwymiarowej tablicy wymiar -1 ma rozmiar C , wymiar -2 ma rozmiar B i tak dalej.

  • Tablice dwu-, trój- i czterowymiarowe często mają określone litery związane z wymiarami. Na przykład dla tablicy 2D:

    • wymiar 0: y
    • wymiar 1: x

    W przypadku tablicy 3D:

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

    W przypadku macierzy 4D:

    • wymiar 0: p
    • wymiar 1: z
    • wymiar 2: y
    • wymiar 3: x
  • Funkcje w XLA API, które przyjmują wymiary, robią to w kolejności rosnącej liczby wymiarów. Jest to zgodne z kolejnością używaną podczas przekazywania wymiarów jako initializer_list ; na przykład

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

    Stworzy kształt, którego tablica wymiarów składa się z sekwencji [A, B, C, D] .

Układ

Protokół Layout opisuje sposób reprezentacji tablicy w pamięci. Protokół Layout zawiera następujące pola:

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

Kolejność wymiarów od małych do dużych

Jedyne wymagane pole to minor_to_major . To pole opisuje mniejsze do większych uporządkowanie wymiarów w kształcie. Wartości w minor_to_major to kolejność wymiarów tablicy (od 0 do N-1 dla tablicy N wymiarowej), przy czym pierwsza wartość jest wymiarem najmniejszym aż do ostatniej wartości, która jest wymiarem najbardziej głównym. Najmniejszy wymiar to wymiar, który zmienia się najszybciej podczas przechodzenia przez elementy tablicy ułożone w pamięci liniowej.

Weźmy na przykład pod uwagę następującą tablicę 2D o rozmiarze [2 x 3] :

 a b c
d e f
 

Tutaj wymiar 0 to rozmiar 2, a wymiar 1 to rozmiar 3. Jeżeli pole minor_to_major w układzie ma wartość [0, 1] to wymiar 0 jest wymiarem najmniejszym, a wymiar 1 jest wymiarem najbardziej głównym. Odpowiada to następującemu układowi w pamięci liniowej:

 a d b e c f
 

Ta kolejność wymiarów od mniejszych do głównych od 0 do N-1 jest podobna do głównej kolumny (w randze 2). Zakładając monotoniczne uporządkowanie wymiarów, inną nazwą, której możemy użyć w odniesieniu do tego układu w kodzie, jest po prostu „dim 0 is minor”.

Z drugiej strony, jeśli pole minor_to_major w układzie ma wartość [1, 0] to układ w pamięci liniowej jest następujący:

 a b c d e f
 

Rząd wymiarów od mniejszego do większego od N-1 do 0 dla tablicy N wymiarowej jest podobny do rzędu głównego (w rzędzie 2). Zakładając monotoniczne uporządkowanie wymiarów, inną nazwą, której możemy użyć w odniesieniu do tego układu w kodzie, jest po prostu „dim 0 is major”.

Domyślna kolejność od drugorzędnych do głównych

Domyślnym układem nowo utworzonych kształtów jest „kolejność wymiarów od głównych do podrzędnych” (podobnie jak w przypadku rzędu głównego na poziomie 2).

Wyściółka

Dopełnienie jest zdefiniowane w opcjonalnych padded_dimensions i padding_value . Pole padded_dimensions opisuje rozmiary (szerokości), do których wypełniony jest każdy wymiar. Jeśli występuje, liczba elementów w padded_dimensions musi być równa randze kształtu.

Na przykład, biorąc pod uwagę tablicę [2 x 3] zdefiniowaną powyżej, jeśli padded_dimensions wynosi [3, 5] wówczas wymiar 0 jest dopełniany do szerokości 3, a wymiar 1 jest dopełniany do szerokości 5. Układ w pamięci liniowej (zakładając wartość wypełnienia 0 i układ główny kolumny) to:

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

Odpowiada to układowi poniższej tablicy z taką samą kolejnością wymiarów od mniejszych do większych:

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

Indeksowanie w tablicach

Klasa IndexUtil w index_util.h zapewnia narzędzia do konwersji między wielowymiarowymi indeksami i indeksami liniowymi o określonym kształcie i układzie. Indeksy wielowymiarowe zawierają indeks int64 dla każdego wymiaru. Indeksy liniowe to pojedyncza wartość int64 która jest indeksowana do bufora przechowującego tablicę. Zobacz shape_util.h i layout_util.h w tym samym katalogu, aby znaleźć narzędzia, które upraszczają tworzenie kształtów i układów oraz manipulowanie nimi.