back to IF3130 Sistem Paralel dan Terdistribusi
Tabel Konsep dan Fungsi Penting CUDA
Berikut adalah rangkuman konsep, fungsi, dan teknik fundamental dalam pemrograman CUDA yang perlu dikuasai.
| Konsep / Fungsi | Keterangan | Poin Kunci & Kapan Digunakan |
|---|---|---|
| Konsep Fundamental | ||
| Filosofi Desain CPU vs. GPU | CPU dioptimalkan untuk Latency (mengerjakan 1 tugas secepat mungkin). GPU dioptimalkan untuk Throughput (mengerjakan banyak tugas bersamaan). | Gunakan CPU untuk bagian sekuensial dan kontrol. Gunakan GPU untuk bagian yang dapat diparalelkan secara masif (komputasi data besar). |
| Model Host + Device | Program terdiri dari Host (CPU) yang menjadi manajer dan Device (GPU) yang menjadi pekerja paralel. Keduanya punya memori terpisah. | Ini adalah model dasar. Semua alur kerja CUDA melibatkan transfer data antara Host dan Device. |
| Model Pemrograman | ||
__global__ void namaKernel(...) | Keyword untuk mendefinisikan sebuah Kernel, yaitu fungsi yang akan dieksekusi di Device (GPU) oleh banyak thread. | Ini adalah inti dari kode paralel Anda. Dideklarasikan di kode global, dipanggil dari Host. |
namaKernel<<<...>>>() | Sintaks peluncuran kernel dari Host ke Device. | Digunakan di main() atau fungsi Host lainnya untuk memulai eksekusi paralel di GPU. |
cudaMalloc, cudaMemcpy, cudaFree | Fungsi-fungsi untuk manajemen memori Device: alokasi, penyalinan data, dan membebaskan memori. | Wajib digunakan untuk mentransfer data input dari Host ke Device sebelum kernel diluncurkan, dan mengambil hasilnya kembali setelah selesai. |
| Hierarki & Eksekusi | ||
| Hierarki Grid > Block > Thread | Struktur 3 tingkat untuk mengorganisir thread. Grid berisi semua thread untuk satu kernel. Block adalah grup thread yang bisa bekerja sama. Thread adalah unit eksekusi terkecil. | Struktur ini fundamental untuk memetakan komputasi ke data. Penting: Thread di dalam satu Block bisa sinkronisasi, tapi antar-Block bersifat independen. |
blockIdx, threadIdx, blockDim | Variabel built-in di dalam kernel untuk mendapatkan ID unik dari thread dan block. | Selalu digunakan di dalam kernel untuk menghitung indeks data mana yang harus dikerjakan oleh setiap thread. Formula idx = blockIdx.x * blockDim.x + threadIdx.x sangat esensial. |
| SM, Warp, dan SIMT | SM: Prosesor di dalam GPU. Warp: Grup berisi 32 thread yang dieksekusi serempak. SIMT: Model eksekusi GPU (Single Instruction, Multiple Thread). | Ini menjelaskan bagaimana hardware bekerja. Scheduler GPU mengeksekusi dalam satuan Warp, bukan thread individual. |
| Manajemen Memori | ||
| Hierarki Memori | CUDA punya berbagai jenis memori dengan kecepatan dan scope berbeda. | Kunci performa adalah meminimalkan akses ke Global Memory yang lambat dan memaksimalkan penggunaan memori on-chip (Shared & Register) yang cepat. |
| Sinkronisasi & Penanganan Masalah | ||
__syncthreads() | Barrier sinkronisasi. Memastikan semua thread di dalam satu Block mencapai titik ini sebelum ada yang bisa lanjut. | Wajib digunakan dalam Tiled Algorithm, yaitu setelah memuat data dari Global ke Shared Memory, dan sebelum mulai komputasi. |
Operasi Atomik (e.g., atomicAdd) | Operasi Read-Modify-Write yang dijamin aman dari race condition. | Untuk mengatasi data race saat banyak thread perlu mengupdate lokasi memori yang sama. Contoh: pada pembuatan histogram. |
| Control Divergence | Terjadi ketika thread-thread dalam satu Warp mengambil jalur if-else yang berbeda. | Ini adalah “pembunuh” performa karena GPU terpaksa menjalankan setiap jalur secara serial. Hindari kondisi percabangan yang bergantung pada threadIdx. |
| Teknik Optimasi Utama | ||
| Tiled Algorithm / Blocking | Pola Load-Sync-Compute. Thread block bekerja sama memuat “ubin” (tile) data dari Global ke Shared Memory untuk digunakan berulang kali. | Teknik paling fundamental untuk mengubah algoritma yang memory-bound menjadi compute-bound. Sangat mengurangi bottleneck akses memori. |
| Memory Coalescing | Terjadi ketika thread-thread dalam satu Warp mengakses lokasi memori Global yang berurutan dan berdekatan. | Penting untuk mendapatkan throughput maksimal dari Global Memory. Desain pola akses data agar coalesced. |
Tabel Detail Hierarki Memori CUDA
| Tipe Memori | Lokasi | Kecepatan | Scope Akses | Lifetime | Deklarasi & Penggunaan |
|---|---|---|---|---|---|
| Registers | On-chip | Sangat Cepat | Per-Thread | Per-Thread | Variabel lokal biasa di dalam kernel. |
| Shared Memory | On-chip | Sangat Cepat | Per-Block | Per-Block | shared int var; Kunci untuk kerja sama antar-thread. |
| Global Memory | Off-chip (DRAM) | Lambat | Grid (Semua Thread) | Aplikasi | Hasil dari cudaMalloc atau variabel global dengan __device__. |
| Constant Memory | Off-chip (di-cache) | Cepat (jika hit) | Grid (Read-Only) | Aplikasi | constant int var; Untuk data read-only yang diakses seragam. |
| Local Memory | Off-chip (DRAM) | Lambat | Per-Thread | Per-Thread | Tumpahan dari register (spilling) atau array lokal besar. Harus dihindari. |