Reduksi Akhir Multi-Blok
Gabungkan jumlah parsial dari setiap blok.
Reduksi Akhir Multi-Blok adalah pelajaran CUDA Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar CUDA Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus CUDA Academy mencakup 4 pelajaran total.
Blok Tidak Dapat Berkomunikasi
Reduksi di dalam satu blok mudah dilakukan, tetapi blok berjalan secara mandiri dan tidak dapat saling menyinkronkan di tengah kernel. Jadi, satu peluncuran tidak dapat menjumlahkan semuanya.
Setiap Blok Menghasilkan Nilai Parsial
Karena itu, setiap blok mereduksi bagiannya sendiri menjadi satu angka, yaitu jumlah parsial, lalu menulisnya ke larik keluaran kecil yang diindeks oleh blockIdx.
if (tid == 0)
out[blockIdx.x] = data[0];Sekarang Nilainya Lebih Sedikit
Dengan 1000 blok, Anda mengubah satu juta input menjadi 1000 nilai parsial. Bagian sulitnya sudah selesai; hanya tersisa larik kecil untuk digabungkan.
Strategi Satu: Luncurkan Lagi
Penyelesaian paling sederhana adalah melakukan peluncuran kedua kernel yang sama pada nilai-nilai parsial. Ulangi hingga hanya tersisa satu nilai.
Rekursif Hingga Tersisa Satu
Setiap lintasan memperkecil larik sebesar ukuran blok. Beberapa peluncuran rekursif dapat mereduksi jutaan nilai menjadi satu jumlah akhir.
Strategi Dua: Operasi Atomik
Alternatifnya, thread 0 dari setiap blok dapat menambahkan nilai parsialnya langsung ke satu total global dengan atomicAdd, sehingga kernel kedua tidak diperlukan.
if (tid == 0)
atomicAdd(total, data[0]);Pertukaran dalam Operasi Atomik
Operasi atomik sederhana dan hanya memerlukan satu peluncuran, tetapi banyak blok yang bersaing mengakses alamat yang sama dapat diproses secara berurutan. Dengan sedikit nilai parsial, cara ini biasanya sudah memadai.
Strategi Tiga: Langkah Grid
Perulangan langkah-grid memungkinkan setiap thread menjumlahkan banyak elemen terlebih dahulu ke dalam register, sehingga jauh lebih sedikit blok yang diperlukan sebelum tahap akhir.
for (int i = gid; i < n; i += gridDim.x * blockDim.x)
sum += in[i];Lebih Sedikit Blok, Lebih Sedikit Beban
Melakukan lebih banyak pekerjaan per thread sejak awal berarti lebih sedikit nilai parsial dan lebih sedikit peluncuran. Cara ini sering kali lebih baik daripada membuat satu thread untuk setiap elemen.
Nolkan Total Terlebih Dahulu
Jika Anda menggunakan operasi atomik, ingatlah untuk menolkan total global sebelum meluncurkan kernel. Jika tidak, penjumlahan Anda akan dimulai dari data sisa yang tidak terduga di memori tersebut.
Pilih Berdasarkan Ukuran Masalah
Input kecil cocok menggunakan operasi atomik karena sederhana; input besar lebih cocok menggunakan desain dua lintasan atau langkah-grid. Lakukan pengukuran pada data Anda untuk menentukan pilihan.
Pemeriksaan Cepat
Pikirkan mengapa satu peluncuran kernel tidak dapat langsung menjumlahkan seluruh larik.
Rangkuman
Setiap blok menghasilkan jumlah parsial, lalu Anda menggabungkannya dengan peluncuran kedua, operasi atomik, atau langkah-grid. Sekarang Anda dapat mereduksi larik dengan ukuran apa pun. 🏁
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Reduksi Akhir Multi-Blok” gratis?
Ya — teks lengkap “Reduksi Akhir Multi-Blok” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus CUDA Academy, upgrade ke CoddyKit PRO. Kursus CUDA Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Reduksi Akhir Multi-Blok”?
Gabungkan jumlah parsial dari setiap blok. Kamu berlatih CUDA Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai CUDA Academy?
Tidak diperlukan pengalaman sebelumnya. CUDA Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Reduksi Akhir Multi-Blok” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran CUDA Academy ini?
Ya. Setiap pelajaran CUDA Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Gagasan Pohon Reduksi
- Hilangkan Divergensi Warp
- Pengalamatan Sekuensial
- Reduksi Akhir Multi-Blok