Segala tentang Nvidia CUDA

quick note, nanti diupdate

Adalah memori konstan pada GPU. Konstan, artinya tidak dapat diubah selama eksekusi kernel.

1. Didefinisikan dengan keyword __constant__

2. Tidak perlu alokasi memori dengan __cudaMalloc__

3. Diisi dengan __cudaMemcpyToSymbol__

4. Langsung tersedia untuk kernel, tidak perlu dipass sebagai parameter

5. Tidak perlu di free (? CMIIW)

Keuntungan menggunakan constant memory adalah dia diakses secara half-warp, sehingga 16 threads yang mengakses alamat yang sama cukup melakukan satu kali pembacaan memori. Di sisi lain, 16 threads ini cuma bisa melakukan satu kali call dalam satu waktu ke satu alamat memori, jadi kalau alamat yang diakses berbeda2 malah bisa lebih lama dari memori global. Karena sifatnya yang konstan, constant memory juga dicache secara agresif oleh GPU.

Kalau Anda para pembaca seperti saya, yang tangannya gatal ingin mencoba mengaplikasikan teknologi CUDA dalam mempelajarinya, ini ada buku bagus: CUDA by Example.

CUDA by Example

CUDA by Example

Buku yang direkomendasikan oleh NVIDIA ini memang oke punya! Dia membahas konsep-konsep CUDA dari dasar sekali dan runtut. Benar-benar didesain untuk para pemula. Sesuai namanya, untuk tiap bahasan disertakan juga contoh program yang mengaplikasikan teori yang dijelaskan. Contohnya pun tidak melulu contoh sederhana yang membosankan, tapi ada juga contoh yang flashy dan bisa untuk pamer ke teman2, hehe. Lumayaan.

Untuk icip-icip bab sampel dari buku ini, silahkan mampir ke halaman NVIDIA ini. Di halaman itu kita juga dapat mendownload listing program yang dijadikan contoh dari si buku. Semua library tambahan yang diperlukan juga ada di sana. Intinya, buku ini sangat cocok untuk yang belajar CUDA. Sangat saya rekomendasikan deh.

Cheers!

Haha, seharusnya saya membuat tulisan ini pertama kali ya? Tenang saja, di indeks tutorial saya tulis pertama kok😉

Jadi apa itu NVIDIA CUDA? Secara singkat, CUDA adalah sebuah teknologi yang dikembangkan oleh NVIDIA untuk mempermudah utilitasi GPU untuk keperluan umum (non-grafis). Arsitektur CUDA ini memungkinkan pengembang perangkat lunak untuk membuat program yang berjalan pada GPU buatan NVIDIA dengan syntax yang mirip dengan syntax C yang sudah banyak dikenal. Akibatnya, sekarang para developer dapat memanfaatkan kemampuan prosesing GPU untuk mengakselerasi komputasi program mereka dengan jaaauuuuh lebih mudah.

Lalu apa manfaatnya susah-susah menggunakan GPU untuk menjalankan program? Begini, berbeda dengan CPU yang harus siap untuk menjalankan berbagai instruksi program, GPU didesain khusus untuk menghitung dan menyajikan pixel-pixel gambar yang akan ditampilkan. Karena satu pixel tidak berhubungan dengan pixel yang lain, GPU dirancang untuk melakukan banyak operasi secara paralel. Nah, kemampuan eksekusi paralel secara masif inilah yang kemudian dapat dimanfaatkan dengan CUDA.

Pemorgraman CUDA sama seperti membuat program C biasa. Saat kompilasi, syntax2 C biasa akan diproses oleh compiler C, sedangkan syntax dengan keyword CUDA akan diproses oleh compiler CUDA (nvcc)

Bagaimana bagi pengguna biasa, apakah ada manfaat yang bisa didapat dari membeli hardware berteknologi CUDA. Hmm, saat ini sudah mulai banyak software yang mendukung akselerasi dengan CUDA. Misalnya MATLAB dan beberapa plugin dari Adobe Photoshop CS5. Bila perangkat lunak ini mendeteksi adanya hardware yang kompatibel dengan CUDA, maka beberapa proses komputasinya akan dilaksanakan oleh GPU. Walhasil, program akan dapat dieksekusi dengan lebih cepat. Review di tomshardware ini contohnya, menampilkan pengurangan waktu eksekusi yang mengesankan dari plugin Photoshop untuk manipulasi gambar.

Seperti telah disebutkan, CUDA memungkinkan programmer untuk mengeksekusi program pada GPU. Tentu saja, program – program yang akan mendapat akselerasi adalah program-program yang dapat dipecah menjadi banyak eksekusi paralel. Untungnya, buanyak komputasi saintifik masuk pada kategori tersebut. Beberapa aplikasinya antara lain Computational Fluid Dynamics (CFD), Molecular Dynamics, Seismic Simulation, Simulasi Finansial dan Saham, Image Processing dan Video Processing

Secara bisnis ini adalah ide yang luar biasa. Pengembangan hardware GPU telah mendapat “subsidi” dari industri gaming dan hasilnya sekarang dapat digunakan untuk aplikasi yang lebih, ahem, “berguna”. Tidak heran saat ini teknologi CUDA telah merevolusi dunia High Performance Computing.

Maka dari itu, saya membuat website ini, untuk mengajak pajak praktisi Indonesia mengakrabi teknologi CUDA ini. Jangan sampai ketinggalan kereta!

Oh iya, hampir lupa: CUDA itu singkatan dari Compute Unified Device Architecture. Semoga bermanfaat!

Halo!

Tulisan kali ini berusahan untuk mendemonstrasikan langkah-langkah yang perlu dilakukan untuk melakukan operasi matematik dengan CUDA. Umumnya langkah yang dilakukan adalah:

1. Deklarasikan kernel
2. Pindahkan data yang diperlukan ke memori GPU
3. Tentukan parameter kernel
4. Eksekusi kernel
5. Pindahkan lagi data hasil komputasi ke host

Untuk lebih memudahkan saya menyediakan contoh program untuk menjumlahkan dua buah matriks A dan B

1. Deklarasi Kernel
Seperti telah disebutkan dalam tutorial tentang prinsip kernel, kernel CUDA didefinisikan dengan syntax __global__ . Perhatikan bahwa dalam kernel tidak terdapat loop untuk menjumlahkan elemen matriks satu demi satu. Ini mendemonstrasikan eksekusi parallel threads-threads dalam menghitung elemen array secara bersamaan.

2. Penyalinan Data dari Host ke GPU
Proses penyalinan data yang melibatkan transfer dari host ke GPU atau sebaliknya ditangani CUDA dengan syntax cudaMemcpy .

3. Parameter Kernel
Kernel pada tutorial ini dieksekusi oleh satu block. Block tersebut mempunyai threads sebanyak elemen yang ada pada matriks. Tentu saja parameter ini hanya akan bekerja bila jumlah elemen matriks tidak melebihin jumlah maksimum threads yang boleh ada pada satu block.

4. Eksekusi Kernel
Panggil kernel dengan parameter yang telah ditentukan dan pass data ke kernel.

5. Ambil Hasil
Pindahkan hasil dari GPU ke host, masih dengan cudaMemcpy . Selain untuk menyalin data dari GPU ke host dan sebaliknya, syntax ini juga dapat digunakan untuk menyalin dari memori GPU ke memori GPU dengan parameter akhirnya diganti menjadi cudaMemcpyDeviceToDevice

6. Bebaskan pointer
Membebaskan pointer ke memori GPU dilakukan dengan syntax cudaFree(pointer) .

Karena wordpress.com hanya membolehkan upload dengan ekstensi tertentu, attachment saya beri ekstensi tambahan .doc . Ekstensi tersebut dapat dihapus setelah didownload. File : belajar_kernel_1.cu

Ok, langsung saja. Bagaimana kita memanjalankan program pada GPU yang kompatibel dengan CUDA ? CUDA menyediakan ekstensi pada bahasa C berupa fungsi yang ditandai tag khusus:
__global__
Bila membaca keyword __global__, CPU akan menjalankan fungsi tersebut di dalam GPU. Setelah memulai eksekusi pada GPU, program akan segera mengeksekusi perintah berikutnya, tidak harus menunggu eksekusi GPU selesai. Hal ini memungkinkan pemrogram untuk menjalankan komputasi secara paralel antara CPU dan GPU.

Selain dengan keyword __global__ , kernel juga dapat dideklarasikan dengan keyword __device__. Bedanya, kernel __device__ini hanya dapat dipanggil oleh kernel yang lain, alias oleh fungsi yang sudah berjalan pada GPU.

Kernel CUDA, baik yang didefinisikan dengan keyword __global__ maupun __device__ , mempunyai kelemahan: ia tak dapat dieksekusi secara rekursif. Artinya, suatu kernel tidak dapat memanggil dirinya sendiri. Kernel CUDA juga tak dapat memanggil fungsi selain kernel CUDA yang lain. Ini berarti fungsi host (CPU) tidak dapat dipanggil dari kernel (GPU).

Kernel sendiri dijalankan dengan banyak thread secara bersamaan pada GPU. Bisa dibilang thread adalah satuan eksekuis terkecil dalam CUDA. Thread ini dikelompokkan pada block. Jumlah thread yang dapat dijalankan pada satu block terbatasi oleh kemampuan hardware, tapi satu kernel dapat dijalankan oleh banyak block sekaligus. Banyaknya block dan thread per block didefinisikan saat memanggil kernel dalam program. Thread yang berada dalam satu block dapat saling berbagi memori, tapi tidak dengan thread yang berada di lain block. Bingung? Sama, saya juga bingung menjelaskannya, haha. Nanti akan saya buat tulisan khusus soal thread dan block ini deh.

Ilustrasi Gambar 1 menjelaskan tentang eksekusi program pada GPU.

 


Gambar 1.

Oke, segitu dulu. Semoga bermanfaat! Pada tulisan berikutnya saya akan memuat tentang satu contoh program CUDA.

Okay, this should be obvious: Everyone who are just starting their CUDA adventure should read the programming guide which come with CUDA toolkit first! I just read it recently and surprised how well written it was for explaining the threads and memory hierarchy.

I’m going to write a kernel tutorial based on the programming guide:D

Hello!

Whew, I’ve been overwhelmed by my day work this past couple of day so I just have the chance to get my hands at CUDA again. I tried to follow tutorial about reduction procedure from The Supercomputing Blog here. The tutorial explains about how threads can share information using shared memory. It also explains about the implementation of threads communication for reduction procedures. Quite interesting. Unfortunately my results (using the tutorial’s source code) is not in CUDA’s favor. Here they are:

Sorry, didn’t have time to make a graph. Since I was curious, I tried to double the max number of elements. The result surprised me. The CPU is still faster AND the average become 0.25 for the highest number of element. All lower number of element will give normal result. And it only happens in CPU calculation too. The data sets were created by the rand() function, so it should be have 0.5 mean. Anyone have any idea whats going on?

Ikuti

Kirimkan setiap pos baru ke Kotak Masuk Anda.