Proto Shape
XLA (xla_data.proto) mendeskripsikan peringkat, ukuran, dan jenis data array N dimensi (singkatnya array).
Terminologi, notasi, dan konvensi
Peringkat 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 adalah label arbitrer untuk kenyamanan. Urutan angka dimensi ini tidak menyiratkan urutan minor/utama tertentu dalam tata letak bentuk. Tata letak ditentukan oleh protoLayout
.Berdasarkan konvensi, dimensi dicantumkan dalam urutan angka dimensi yang terus bertambah. 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 menggunakan dimensi melakukannya dalam urutan angka dimensi yang meningkat. 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
mencakup kolom berikut:
message Layout {
repeated int64 minor_to_major = 1;
repeated int64 padded_dimensions = 2;
optional PaddingValue padding_value = 3;
}
Penyusunan dimensi minor hingga besar
Satu-satunya kolom yang wajib diisi adalah minor_to_major
. Kolom ini menjelaskan urutan 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 paling kecil hingga nilai terakhir yang merupakan dimensi paling besar. Dimensi
yang paling kecil adalah dimensi yang berubah paling cepat saat menelusuri
elemen array yang terletak dalam memori linear.
Misalnya, perhatikan array 2D berikut dengan ukuran [2 x 3]
:
a b c
d e f
Di sini, 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 yang paling utama. Hal ini
sesuai dengan tata letak berikut dalam memori linear:
a d b e c f
Urutan dimensi minor-ke-besar dari 0
hingga N-1
ini serupa dengan kolom-utama
(pada peringkat 2). Dengan asumsi urutan dimensi monoton, cara lain yang dapat kita
merujuk ke tata letak ini dalam kode sebenarnya adalah "dim 0 is minor".
Di sisi lain, jika kolom minor_to_major
dalam tata letak adalah [1, 0]
,
tata letak dalam memori linear adalah:
a b c d e f
Urutan dimensi minor ke utama dari N-1
hingga 0
untuk array dimensi N
serupa dengan row-major (di peringkat 2). Dengan asumsi urutan dimensi monoton, cara lain yang dapat kita gunakan untuk merujuk tata letak ini dalam kode adalah "dim 0
adalah besar".
Pengurutan minor-ke-besar default
Tata letak default untuk Bentuk yang baru dibuat adalah "urutan dimensinya 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 diberi padding pada 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 ditambahkan 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 dengan mempertimbangkan 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.