CUDA Academy · Pelajaran

Bina Histogram

Gunakan operasi atom dengan penswastaan memori kongsi.

Pelajaran 3 daripada 413 langkah

Bina Histogram ialah pelajaran CUDA Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran CUDA Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus CUDA Academy merangkumi sejumlah 4 pelajaran.

Perkara yang Dikira oleh Histogram

Histogram mengira bilangan input yang jatuh ke dalam setiap bin. Banyak utas akan cuba menokok bin yang sama, jadi ini ialah masalah operasi atom. 📊

Pendekatan Naif

Setiap utas membaca satu elemen, mencari binnya dan menokok bin tersebut. Tanpa perlindungan, bin yang popular kehilangan kiraan akibat perlumbaan.

Versi Atomic Global

Penyelesaian betul yang paling mudah ialah satu atomicAdd bagi setiap elemen terus ke memori global. Ia berfungsi, tetapi bin yang sibuk menyebabkan utas dilaksanakan secara bersiri.

atomicAdd(&hist[bin], 1);

Masalah Persaingan

Apabila data terkumpul dalam beberapa bin, ribuan utas bertumpu pada alamat yang sama. Persaingan itu boleh menjadikan operasi atom global amat perlahan.

Penswastaan sebagai Penyelesaian

Penswastaan memberikan setiap blok histogram peribadinya sendiri dalam memori dikongsi yang pantas. Utas hanya bertembung dalam blok masing-masing, bukan di seluruh grid.

Isytiharkan Histogram Dikongsi

Setiap blok mengisytiharkan tatasusunan dikongsi yang saiznya mengikut bilangan bin. Tatasusunan ini berada pada cip, jadi operasi atom di situ jauh lebih murah berbanding operasi global.

__shared__ int local[NBINS];

Langkah 1: Kosongkan Bin

Utas mengosongkan histogram dikongsi secara bekerjasama, kemudian memanggil __syncthreads supaya tiada utas mengira sebelum proses mengosongkan selesai.

local[tid] = 0;
__syncthreads();

Langkah 2: Kira Secara Tempatan

Kini setiap utas menaikkan bin masing-masing secara atom dalam memori dikongsi. atomicAdd yang sama digunakan, tetapi pada salinan pantas pada cip dan bukannya salinan global.

atomicAdd(&local[bin], 1);

Langkah 3: Cantumkan ke Global

Selepas sekatan, utas menambah setiap bin dikongsi ke dalam histogram global dengan satu atomicAdd bagi setiap bin. Jauh lebih sedikit operasi atom global berbanding sebelumnya.

atomicAdd(&hist[i], local[i]);

Mengapa Ini Lebih Pantas

Operasi atom pada memori dikongsi adalah pantas, dan operasi atom global yang mahal kini berlaku sekali bagi setiap bin bagi setiap blok, bukannya sekali bagi setiap elemen.

Perhatikan Bilangan Bin

Histogram peribadi mesti muat dalam memori dikongsi. Jika terdapat terlalu banyak bin, bahagikannya kepada beberapa laluan atau kembali menggunakan operasi atom global.

Semakan Pantas

Satu soalan tentang strategi histogram.

Imbas Kembali: Membina Histogram

Anda membina histogram dengan operasi atom global, kemudian mempercepatkannya menggunakan penswastaan memori dikongsi: kosongkan, kira secara tempatan dan cantumkan. ✅

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
30
Pelajaran
120

Soalan Lazim

Adakah pelajaran “Bina Histogram” percuma?

Ya — teks penuh “Bina Histogram” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus CUDA Academy, tingkat taraf kepada CoddyKit PRO. Kursus CUDA Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Bina Histogram”?

Gunakan operasi atom dengan penswastaan memori kongsi. Anda berlatih CUDA Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan CUDA Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran CUDA Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Bina Histogram” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran CUDA Academy ini?

Ya. Setiap pelajaran CUDA Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Keadaan Perlumbaan pada GPU
  2. atomicAdd dan Rakan-rakannya
  3. Bina Histogram
  4. Operasi Atom Tersuai dengan atomicCAS
← Kembali ke CUDA Academy