18 / 24 · Konsep
Tile, halo, dan jumlah parsial
Untuk Th=Tw=2,Tc=1,Tm=2,kernel 3×3,stride dua,dilation satu, hitung byte masukan/bobot/jumlah 32 bit/bias dengan satu penyangga.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Bagilah tensor agar muat dalam penyimpanan
Pilih tinggi keluaran Th,lebar Tw,jumlah kanal masukan Tc,dan jumlah kanal keluaran Tm untuk satu tile. Halo masukan membentang melampaui tile keluaran. Untuk stride S,dilation D,dan kernel R, tinggi masukan yang dibutuhkan adalah (Th−1)S+(R−1)D+1; terapkan padanan horizontal untuk lebar. Padding batas dapat dihasilkan alih-alih diambil dari memori.
Pembagian kanal masukan memerlukan pemeliharaan setiap jumlah parsial keluaran sepanjang seluruh tile kanal. Membulatkan setiap tile terlalu dini mengubah operasi. Tambahkan bias sekali pada tile kanal pertama, lalu lanjutkan jumlah yang sama. Perubahan tile kanal keluaran juga mengubah bobot dan bias.
Contoh anggaran penyimpanan
Untuk operasi 3×3 dengan stride satu dan dilation satu, misalkan Th=Tw=2,Tc=2,Tm=2. Halo adalah 4×4, membutuhkan 32 byte masukan int8. Bobot menggunakan 2×2×3×3=36 byte. Delapan jumlah parsial 32 bit menggunakan 32 byte, dan dua bias 32 bit menggunakan delapan. Total:108 byte. Skala, alamat, validitas, dan penyimpanan kendali tidak termasuk dan membutuhkan alokasi terpisah.
Penyangga ganda untuk masukan dan bobot membutuhkan 2×(32+36)+32+8=176 byte, melebihi anggaran 128 byte. Mengurangi Tc menjadi satu memberi masukan enam belas dan bobot delapan belas byte. Penyimpanan dengan penyangga ganda menjadi 2×34+32+8=108 byte. Pertahankan jumlah parsial sepanjang dua tile kanal masukan. Kecukupan ruang penyangga tidak membuktikan transfer dapat bertumpang tindih dengan komputasi; periksa jadwal secara terpisah.
Stride dua memperbesar bentang masukan tile keluaran 2×2 yang sama menjadi 5×5. Tile bersebelahan dapat berbagi nilai halo, tetapi pemuatan ulang independen tetap menduplikasi lalu lintas. Bedakan byte tensor unik, yang merupakan batas bawah, dari transfer tile sebenarnya.
Jika M=5 dan Tm=2, tile terakhir memiliki satu kanal keluaran valid. Beri mask pada akses bobot dan keluaran tambahan. Terapkan mask setara pada tile spasial dan kanal masukan terakhir. Dokumentasi NVIDIA CUTLASS menjelaskan pendekatan implicit-GEMM nyata yang menghasilkan tile tanpa matriks diperluas penuh. Di sini kita menghitung penyimpanan dan jumlah parsial, bukan menjalankan implementasi CUDA tersebut.
Coba sendiri
Untuk Th=Tw=2,Tc=1,Tm=2,kernel 3×3,stride dua,dilation satu, hitung byte masukan/bobot/jumlah 32 bit/bias dengan satu penyangga.
Baca penjelasan
Masukan 5×5 menggunakan 25 byte. Tambahkan delapan belas byte bobot,32 byte jumlah,dan delapan byte bias:83 byte, tidak termasuk kendali dan skala.