Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Bentuk dan Tata Letak

Proto Shape XLA ( xla_data.proto ) menjelaskan peringkat, ukuran, dan tipe data dari 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 hingga N-1 untuk larik dimensi N Angka dimensi adalah label arbitrer untuk kenyamanan. Urutan angka-angka dimensi ini tidak menyiratkan urutan minor / utama dalam tata letak bentuk. Tata letak ditentukan oleh proto Layout .

  • Berdasarkan konvensi, dimensi terdaftar dalam urutan peningkatan jumlah dimensi. Misalnya, untuk array ukuran 3 dimensi [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, mirip dengan Python; Dimensi -1 adalah dimensi terakhir (setara dengan N-1 untuk array dimensi N ). Misalnya, untuk larik 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 memiliki huruf khusus 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 larik 4D:

    • dimensi 0: p
    • dimensi 1: z
    • dimensi 2: y
    • dimensi 3: x
  • Fungsi dalam API XLA yang mengambil dimensi melakukannya dengan meningkatkan urutan nomor dimensi. Ini cocok dengan pemesanan yang digunakan ketika melewati dimensi sebagai initializer_list ; misalnya

    ShapeUtil::MakeShape(F32, {A, B, C, D})

    Akan membuat bentuk array ukuran dimensi yang terdiri dari urutan [A, B, C, D] .

Tata letak

Proto Layout menjelaskan bagaimana array diwakili dalam memori. Proto Layout mencakup bidang-bidang berikut:

 message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}
 

Pemesanan dimensi minor-ke-utama

Satu-satunya bidang yang diperlukan adalah minor_to_major . Bidang ini menjelaskan urutan dimensi minor-ke-utama dalam bentuk. Nilai dalam minor_to_major adalah urutan dimensi array ( 0 hingga N-1 untuk array dimensi N ) dengan nilai pertama menjadi dimensi paling minor hingga nilai terakhir yang merupakan dimensi paling utama. Dimensi yang paling minor adalah dimensi yang berubah paling cepat ketika melangkah melalui elemen-elemen array yang diletakkan dalam memori linier.

Misalnya, pertimbangkan array ukuran 2D berikut [2 x 3] :

 a b c
d e f
 

Di sini dimensi 0 adalah ukuran 2, dan dimensi 1 adalah ukuran 3. Jika bidang minor_to_major dalam tata letak adalah [0, 1] maka dimensi 0 adalah dimensi yang paling minor dan dimensi 1 adalah dimensi yang paling besar. Ini sesuai dengan tata letak berikut dalam memori linier:

 a d b e c f
 

Urutan dimensi minor hingga mayor dari 0 hingga N-1 ini mirip dengan kolom-mayor (pada peringkat 2). Dengan asumsi urutan dimensi monotonik, nama lain yang dapat kita gunakan untuk merujuk tata letak ini dalam kode hanyalah "redup 0 minor".

Di sisi lain, jika bidang minor_to_major dalam tata letak adalah [1, 0] maka tata letak dalam memori linier adalah:

 a b c d e f
 

Urutan dimensi minor-ke-utama dari N-1 ke 0 untuk array dimensi N mirip dengan baris-utama (pada peringkat 2). Dengan asumsi urutan dimensi monotonik, nama lain yang dapat kita gunakan untuk merujuk tata letak ini dalam kode hanyalah "redup 0 adalah utama".

Pemesanan minor-ke-utama

Tata letak default untuk Bentuk yang baru dibuat adalah "urutan dimensi adalah major-to-minor" (mirip dengan baris-mayor di peringkat 2).

Lapisan

Padding didefinisikan dalam bidang opsional padded_dimensions dan padding_value . Bidang padded_dimensions menjelaskan ukuran (lebar) yang menjadi dasar setiap dimensi. Jika ada, jumlah elemen dalam padded_dimensions harus sama dengan pangkat bentuk.

Sebagai contoh, mengingat array [2 x 3] ditentukan di atas, jika padded_dimensions adalah [3, 5] maka dimensi 0 diisi hingga lebar 3 dan dimensi 1 diisi hingga lebar 5. Tata letak dalam memori linier (dengan asumsi nilai padding dari 0 dan tata letak kolom-utama) adalah:

 a d 0 b e 0 c f 0 0 0 0 0 0 0
 

Ini sama 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

IndexUtil kelas di index_util.h menyediakan utilitas untuk mengkonversi antara indeks multidimensi dan indeks linier yang diberikan bentuk dan tata letak. Indeks multidimensi menyertakan indeks int64 untuk setiap dimensi. Indeks linear adalah nilai int64 tunggal yang indeks ke buffer memegang array. Lihat shape_util.h dan layout_util.h di direktori yang sama untuk utilitas yang menyederhanakan pembuatan dan manipulasi bentuk dan tata letak.