Tata letak {i>tiled


Gambar 1

Gambar 1 menunjukkan bagaimana susunan F32 [3,5] ditata dalam memori dengan ubin 2x2. Bentuk dengan tata letak ini ditulis sebagai F32[3,5]{1,0:T(2,2)}, dengan 1,0 berkaitan dengan urutan fisik dimensi (kolom minor_to_major dalam Tata Letak) sedangkan (2,2) setelah tanda titik dua menunjukkan ubin dimensi fisik oleh ubin 2x2.

Secara intuitif, ubin ditata untuk menutupi bentuk, lalu di dalam setiap ubin, elemen kemudian ditata tanpa ubin, seperti pada contoh di atas, dengan bagian kanan dari contoh menunjukkan tata letak dalam memori, termasuk elemen padding putih yang ditambahkan untuk memiliki ubin 2x2 lengkap meskipun batas array aslinya tidak merata.

Elemen tambahan dalam padding tidak harus berisi nilai tertentu.

Formula indeks linear untuk penyusunan ubin yang diberi bentuk dan ubin

Tanpa penyusunan ubin, elemen e=(en, en-1, ... , e1) dalam array dengan batas array d=(dn, dn-1, ... , d1) (d1 adalah dimensi paling kecil) (d1 adalah dimensi paling kecil) yang disusun berdasarkan urutan utama hingga minor pada posisi:

linear_index(e, d)
= linear_index((en, en-1, ... , e1), (dn, dn-1, ... , d1))
= endn-1...d1 + en-1...1 + en-1 ... 1 + en-1d1

Untuk menyederhanakan notasi dalam dokumen ini, kami asumsikan bahwa kartu memiliki jumlah dimensi yang sama dengan array. Dalam penerapan ubin XLA, hal ini digeneralisasi pada ubin dengan dimensi yang lebih sedikit dengan membiarkan dimensi awal yang paling utama tidak berubah dan menerapkan pemasangan ubin hanya ke dimensi paling kecil, sehingga ubin yang ditentukan menyebutkan akhiran dimensi fisik bentuk yang menjadi ubin.

Saat ubin ukuran (tn, tn-1, ... , t1) digunakan, elemen dalam array dengan indeks (en, en-1, ... , e1) dipetakan ke posisi ini di tata letak akhir:

linear_index_with_til(e, d, t)
= linear_index((⌊e/t⌋, e mod t), (⌈d/t⌉, t)) (aritmetika adalah elementwise, (a,b) adalah penyambungan)
= linear_index((⌊en)
= linear_index((⌊en)n

Tata letak dapat dianggap memiliki dua bagian: (⌊en/tn⌋, ... , ⌊e1/t1⌋), yang sesuai dengan indeks kartu dalam array ubin ukuran (⌈dn/tn⌉, ... , ⌈d1⌉, ... , ⌈d1, ... , ⌈d1⌉, ... , ⌈d1 Fungsi ceil muncul dalam ⌈di/ti⌉ karena jika kartu memenuhi batas array yang lebih besar, padding akan disisipkan seperti dalam Gambar 1. Ubin dan elemen dalam kartu disusun secara rekursif tanpa pembuatan ubin.

Misalnya pada Gambar 1, elemen (2,3) memiliki indeks kartu (1,1), dan indeks dalam ubin (0,1), untuk vektor koordinat gabungan (1,1,0,1). Indeks kartu memiliki batas (2,3) dan kartu itu sendiri adalah (2,2) untuk vektor gabungan (2,3,2,2). Indeks linear dengan kartu untuk elemen dengan indeks (2,3) dalam bentuk logis kemudian

linear_index_with_til((2,3), (3,5), (2,2))
= linear_index((1,1,0,1), (2,3,2,2))
= linear_index((1,1), (2,3)) ∙ 2 ∙ 2 + linear_index((0,1), (2,2))
∙ ∙ 2 ∙ (2,2))
=

Pemasangan Ubin sebagai transposisi pad-reshape

Tata letak berbasis ubin beroperasi sebagai berikut:
Pertimbangkan array dimensi (dn, dn-1, ... , d1) (d1 adalah dimensi paling kecil). Ketika ditata dengan ubin berukuran (tn, tn-1, ... , t1) (t1 adalah dimensi yang paling kecil), ubin tersebut dapat dijelaskan dalam hal pad-reshape-transpose dengan cara berikut.

  1. Array diberi padding ke (⌈dn/tn⌉∙tn, ... , ⌈d1/t1⌉∙t1).
  2. Setiap dimensi i dipecah menjadi (⌈di/ti⌉, ti), yaitu array dibentuk ulang menjadi
    (⌈dn/tn⌉, tn, ... , ⌈d1/t1⌉, t1).
    Tidak ada perubahan tata letak fisik dalam bentuk ulang ini, sehingga bentuk ulang ini bersifat bitcast. Jika seseorang tidak secara eksplisit memikirkan penyusunan ulang, pembentukan ulang ini dapat mengekspresikan bentuk apa pun dengan jumlah elemen yang sama seperti bentuk dengan padding - contoh di sini adalah cara mengekspresikan kartu dengan cara ini.
  3. Transpose terjadi dengan memindahkan tn, ... , t1 ke dimensi yang paling kecil sambil mempertahankan urutan relatifnya, sehingga urutan dimensi dari yang paling besar ke paling kecil menjadi
    (⌈dn/tn⌉, ... , ⌈d1/t1⌉, ...n, t1, tn, t1, t1, tn

Bentuk akhir memiliki awalan
(⌈dn/tn⌉, ... , ⌈d1/t1⌉), yang menjelaskan jumlah ubin di setiap dimensi. Elemen dalam array (en, ... , e1) dipetakan ke elemen ini dalam bentuk akhir:
(⌊en/tn⌋, ... , ⌊e0/t0⌋, en mod tn, ... , e1 ). Sangat mudah untuk melihat bahwa indeks linear elemen mengikuti formula di atas seperti yang diharapkan.

Pemasangan ubin berulang

Pemasangan ubin XLA menjadi lebih fleksibel dengan menerapkannya berulang kali.


Gambar 2

Gambar 2 menunjukkan bagaimana array berukuran 4x8 disusun menggunakan dua tingkat penyusunan ubin (2x4 pertama lalu 2x1). Kami menggambarkan penyusunan berulang ini sebagai (2,4)(2,1). Setiap warna menunjukkan kartu 2x4 dan setiap kotak batas merah adalah kartu 2x1. Angka tersebut menunjukkan indeks linear dalam memori elemen tersebut dalam format tile. Format ini cocok dengan format yang digunakan untuk BF16 di TPU, kecuali bahwa kartu awal lebih besar, yaitu ubinnya (8.128)(2,1), dengan tujuan penyusunan kedua ubin 2x1 adalah mengumpulkan dua nilai 16-bit untuk membentuk satu nilai 32-bit dengan cara yang sejajar dengan arsitektur TPU.

Perhatikan bahwa kartu kedua atau yang lebih baru dapat merujuk ke dimensi minor dalam kartu, yang hanya menyusun ulang data dalam kartu, seperti dalam contoh ini dengan (8.128)(2,1), tetapi juga dapat merujuk ke dimensi lintas kartu utama dari pemetaan ubin sebelumnya.

Menggabungkan dimensi menggunakan ubin

Pemasangan ubin XLA juga mendukung penggabungan dimensi. Misalnya, fitur ini dapat menggabungkan dimensi di F32[2,7,8,11,10]{4,3,2,1,0} menjadi F32[112,110]{1,0} terlebih dahulu sebelum menyatukannya dengan (2,3). Ubin yang digunakan adalah (∗,∗,2,∗,3). Di sini, tanda bintang dalam kartu menyiratkan mengambil dimensi tersebut dan menggabungkannya dengan dimensi lain yang lebih kecil berikutnya. Beberapa dimensi yang berdekatan dapat digabungkan ke dalam satu dimensi. Dimensi yang disertakan direpresentasikan oleh nilai kartu -1 dalam dimensi kartu tersebut, yang tidak valid dalam kartu sebagai ukuran dimensi.

Lebih tepatnya, jika dimensi i dari bentuk dihilangkan melalui tanda bintang di ubin, maka sebelum definisi ubin sebelumnya diterapkan, dimensi tersebut dihapus dari bentuk yang menjadi {i>tiled <i}dan vektor ubin, dan dimensi i-1 dari bentuk tersebut memiliki ikatan array yang ditingkatkan dari di-1 menjadi didi-1. Langkah ini diulang untuk setiap tanda bintang dalam vektor kartu.