Bentuk dan tata letak

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 sampai N-1 untuk array dimensi N. 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 proto Layout.

  • 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 ukuran A, dimensi 1 memiliki ukuran B, dan dimensi 2 memiliki ukuran C.

    Beberapa utilitas di XLA juga mendukung pengindeksan negatif seperti Python: Dimensi -1 adalah dimensi terakhir (setara dengan N-1 untuk array dimensi N). Misalnya, untuk array 3 dimensi yang dijelaskan di atas, dimensi -1 memiliki ukuran C, dimensi -2 memiliki ukuran B, 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
  • 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.