Protokół XLA Shape
( 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, które mają rozmiar większy niż 1.
Wymiary są numerowane od
0
doN-1
dla tablicyN
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 rozmiarA
, wymiar 1 ma rozmiarB
a wymiar 2 ma rozmiarC
Niektóre narzędzia w XLA obsługują również indeksowanie ujemne, podobnie jak Python; wymiar -1 to ostatni wymiar (odpowiednik
N-1
dla tablicyN
wymiarowej). Na przykład dla opisanej powyżej trójwymiarowej tablicy wymiar -1 ma rozmiarC
, wymiar -2 ma rozmiarB
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
- wymiar 0:
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ładShapeUtil::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;
}
Porządkowanie wymiarów od małych do dużych
Jedyne wymagane pole to minor_to_major
. To pole opisuje mniejszy do większego uporządkowanie wymiarów w kształcie. Wartości w minor_to_major
są uporządkowaniem 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śli 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
Ten rząd wymiarów od mniejszego do większego od 0
do N-1
jest podobny do głównego 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 (rzędu 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 pomocniczych” (podobnie jak w przypadku rzędu głównego w randze 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 tą 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.