Proto Shape
XLA (xla_data.proto) mendeskripsikan peringkat, ukuran, dan jenis data array N dimensi (singkatnya adalah array).
Terminologi, notasi, dan konvensi
Peringkat sebuah array sama dengan jumlah dimensi. Peringkat sebenarnya dari array adalah jumlah dimensi yang memiliki ukuran lebih besar dari 1.
Dimensi diberi nomor dari
0
sampaiN-1
untuk array dimensiN
. Nomor dimensi merupakan label arbitrer untuk kenyamanan. Urutan nomor dimensi ini tidak menyiratkan pengurutan minor/utama tertentu dalam tata letak bentuk. Tata letak ditentukan oleh protoLayout
.Berdasarkan konvensi, dimensi dicantumkan dalam urutan angka dimensi yang meningkat. Misalnya, untuk array 3 dimensi dengan ukuran
[A x B x C]
, dimensi 0 memiliki ukuranA
, dimensi 1 memiliki ukuranB
, dan dimensi 2 memiliki ukuranC
.Beberapa utilitas di XLA juga mendukung pengindeksan negatif seperti Python: Dimensi -1 adalah dimensi terakhir (setara dengan
N-1
untuk array dimensiN
). Misalnya, untuk array 3 dimensi yang dijelaskan di atas, dimensi -1 memiliki ukuranC
, dimensi -2 memiliki ukuranB
, dan seterusnya.Array dua, tiga, dan empat dimensi sering kali memiliki huruf tertentu yang terkait dengan dimensi. Misalnya, untuk array 2D:
- dimensi 0:
y
- dimensi 1:
x
Untuk array 3D:
- dimensi 0:
z
- dimensi 1:
y
- dimensi 2:
x
Untuk array 4D:
- dimensi 0:
p
- dimensi 1:
z
- dimensi 2:
y
- dimensi 3:
x
- dimensi 0:
Fungsi di XLA API yang mengambil dimensi melakukannya dalam urutan nomor dimensi yang meningkat. Hal ini cocok dengan pengurutan yang digunakan saat meneruskan dimensi sebagai
initializer_list
; misalnya,ShapeUtil::MakeShape(F32, {A, B, C, D})
akan membuat bentuk yang array ukuran dimensinya terdiri dari urutan
[A, B, C, D]
.
Tata Letak
Proto Layout
menjelaskan cara array direpresentasikan dalam memori. Proto Layout
menyertakan kolom berikut:
message Layout {
repeated int64 minor_to_major = 1;
repeated int64 padded_dimensions = 2;
optional PaddingValue padding_value = 3;
}
Pengurutan dimensi minor ke utama
Satu-satunya kolom yang wajib diisi adalah minor_to_major
. Kolom ini menjelaskan pengurutan dimensi minor hingga utama dalam suatu bentuk. Nilai dalam minor_to_major
adalah urutan dimensi array (0
hingga N-1
untuk array dimensi N
) dengan nilai pertama menjadi dimensi yang paling kecil hingga nilai terakhir yang merupakan dimensi paling utama. Dimensi yang paling kecil
adalah dimensi yang berubah paling cepat saat melewati
elemen array yang terletak dalam memori linear.
Misalnya, pertimbangkan array 2D dengan ukuran [2 x 3]
berikut:
a b c
d e f
Berikut dimensi 0
adalah ukuran 2, dan dimensi 1
adalah ukuran 3. Jika
kolom minor_to_major
dalam tata letak adalah [0, 1]
, dimensi 0
adalah
dimensi paling kecil dan dimensi 1
adalah dimensi paling utama. Hal ini
sesuai dengan tata letak berikut dalam memori linear:
a d b e c f
Urutan dimensi minor ke utama dari 0
hingga N-1
ini mirip dengan kolom-besar
(pada peringkat 2). Dengan asumsi urutan dimensi monoton, cara lain yang dapat kita
rujuk untuk tata letak ini dalam kode hanyalah "dim 0 is minor".
Di sisi lain, jika kolom minor_to_major
dalam tata letak adalah [1, 0]
, maka
tata letak dalam memori linear adalah:
a b c d e f
Urutan dimensi minor ke utama sebesar N-1
hingga 0
untuk array dimensi N
mirip dengan row-major (pada peringkat 2). Dengan asumsi urutan dimensi
monoton, cara lain untuk merujuk tata letak ini dalam kode hanyalah "redupan 0
adalah utama".
Pengurutan minor-ke-utama default
Tata letak default untuk Bentuk yang baru dibuat adalah "urutan dimensi major-to-minor" (serupa dengan baris utama di peringkat 2).
Padding
Padding ditentukan dalam kolom padded_dimensions
dan padding_value
opsional. Kolom padded_dimensions
menjelaskan ukuran (lebar) yang digunakan untuk setiap
dimensi. Jika ada, jumlah elemen dalam padded_dimensions
harus sama dengan peringkat bentuk.
Misalnya, dengan array [2 x 3]
yang ditentukan di atas, jika padded_dimensions
adalah
[3, 5]
, dimensi 0 akan diberi padding dengan lebar 3 dan dimensi 1 diberi padding
ke lebar 5. Tata letak dalam memori linear (dengan asumsi nilai padding 0 dan
tata letak utama kolom) adalah:
a d 0 b e 0 c f 0 0 0 0 0 0 0
Ini setara dengan tata letak array berikut dengan urutan dimensi minor ke utama yang sama:
a b c 0 0
d e f 0 0
0 0 0 0 0
Pengindeksan ke dalam array
Class IndexUtil
di index_util.h menyediakan utilitas untuk melakukan konversi antara indeks multidimensi dan indeks linear berdasarkan bentuk dan tata letak. Indeks multidimensi menyertakan indeks int64
untuk setiap dimensi. Indeks linear adalah nilai int64
tunggal yang
mengindeks ke dalam buffer yang menyimpan array. Lihat shape_util.h
dan
layout_util.h
dalam direktori yang sama untuk utilitas yang menyederhanakan pembuatan dan
manipulasi bentuk dan tata letak.