Bentuk dan tata letak

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

  • 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 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 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.