Dorongan untuk pemrograman GPU

10

Saya sangat baru dalam pemrograman GPGPU jadi tolong maafkan saya jika pertanyaannya tidak tepat. Dari apa yang saya pahami pemrograman GPU adalah bagian yang sangat rumit dari pekerjaan teknik jika dibandingkan dengan pemrograman CPU biasa. Kita harus sangat berhati-hati tentang masalah divergensi, ubin, alokasi memori yang disematkan, dan komunikasi perangkat / komputasi perangkat yang tumpang tindih.

Setelah melakukan sedikit penelitian saya menemukan perpustakaan dorong yang tampaknya mencoba meniru C ++ STL. Ini cukup bagus. Namun, berdasarkan pengalaman saya yang sangat terbatas dan setelah melihat semua manajemen mikro diperlukan untuk mendapatkan kinerja yang baik, saya sedikit skeptis tentang kinerja tersebut. Dapatkah dorong efisien menangani semua bagian pemrograman yang rumit secara internal? Beberapa perpustakaan yang sangat terkenal, seperti PETSc, tampaknya menggunakan paket ini yang membuat saya percaya seharusnya.

Saya bertanya-tanya apakah orang-orang dengan pengalaman lebih pada CUDA dan dorong bisa mengatakan satu atau dua kata tentang kinerja paket jika dibandingkan dengan pemrograman CUDA tingkat rendah. Kapan saya bisa menggunakan dorongan dan kapan saya harus kembali ke CUDA?

GradGuy
sumber
Sudahkah Anda mempertimbangkan ArrayFire?
arrayfire

Jawaban:

2

Saya tidak memiliki pengalaman pribadi dengan dorongan, tetapi saya menggunakan ViennaCL, yang merupakan perpustakaan GPU tingkat tinggi lainnya yang menyembunyikan hampir semua detail. Dari pembandingan pribadi saya, saya dapat melihat peningkatan 2x - 40x pada perhitungan sebenarnya jika Anda mengabaikan waktu yang diperlukan untuk bergerak di sekitar memori.

Kapan Anda harus menggunakan CPU vs dorong vs CUDA semua tergantung pada masalah yang Anda selesaikan, keterampilan Anda, dan waktu yang Anda miliki. Saya akan merekomendasikan memulai dengan memecahkan masalah sederhana dengan ketiga metode untuk melihat kinerja relatif mereka. Kemudian Anda dapat menulis perangkat lunak Anda yang sebenarnya dengan cepat, membandingkannya, dan menerapkan metode gpu yang sesuai di bidang-bidang yang memerlukan percepatan, daripada membuang waktu Anda menulis perangkat lunak CUDA yang hanya akan memberi Anda beberapa menit waktu eksekusi .

Pelihat Godric
sumber
Itu masuk akal bagi saya. Kita harus selalu profil dulu. Jadi dalam contoh Anda, speedup yang Anda dapatkan adalah dari menggunakan ViennaCL. Sudahkah Anda mencoba OpenCL langsung untuk memeriksa perbedaannya?
GradGuy
Tidak, seperti Anda, saya baru mengenal komputasi GPU. Saya berencana selama satu atau dua tahun ke depan untuk perlahan-lahan memperluas keterampilan saya untuk memasukkan CUDA dan OpenCL, tetapi saat ini saya hanya menggunakan perpustakaan. Dokumentasi ViennaCL menyatakan bahwa mempercepat lebih lanjut akan dimungkinkan dengan implementasi openCL yang disetel yang kemungkinan akan berada di urutan 2x-10x lainnya, namun saya telah belajar bahwa bandwidth memori adalah gorila 900 pound dalam ruangan yang benar-benar menentukan kinerja Anda.
Godric Seer
5

Saya telah menggunakan Thrust dalam proyek perluasan kluster terkait saya. Bergantung pada situasinya, Thrust dapat berkinerja sebaik atau lebih baik daripada implementasi level rendah yang Anda roll sendiri (khususnya, reducekernel telah bekerja cukup baik untuk saya). Namun sifat dan fleksibilitas generik Thrust berarti kadang-kadang harus melakukan banyak penyalinan tambahan, susunan array, dll. Yang dapat memperlambatnya sedikit dalam beberapa kasus tepi yang buruk. Terakhir kali saya menggunakannya sortcukup lambat dibandingkan dengan perpustakaan lain seperti b40c atau mgpu. Namun, NVIDIA telah bekerja untuk meningkatkan kinerja algoritme Thrust sehingga tidak terlalu menjadi masalah di masa depan.

Anda harus mencoba menulis kode Anda menggunakan Thrust dan CUDA dan kemudian menggunakan Visual Profiler untuk menentukan mana yang lebih baik untuk tugas spesifik yang Anda minati. Jika kemungkinan transfer memori akan memakan waktu paling lama dari program Anda dan Anda tidak Anda tidak perlu khawatir tentang mengoptimalkan kernel Anda sendiri untuk konflik bank, jumlah instruksi, dll. maka saya akan menggunakan Thrust. Ini juga memiliki keuntungan tambahan yaitu membuat kode Anda jauh lebih sedikit dan lebih mudah bagi orang yang tidak terbiasa dengan pemrograman GPU untuk membaca.

jeruk nipis
sumber
3

Tujuan dorongan (karena sebagian besar pustaka templat) adalah untuk memberikan abstraksi tingkat tinggi, sambil mempertahankan kinerja yang baik, atau bahkan luar biasa.

Saya sarankan untuk tidak terlalu khawatir tentang kinerja, tetapi untuk bertanya pada diri sendiri jika

  • aplikasi Anda dapat dijelaskan dalam hal algoritma yang diterapkan di dorong, dan jika

  • Anda menyukai kemungkinan menulis kode paralel "generik", tanpa perlu masuk ke detail berdarah untuk menemukan pemetaan yang efisien untuk arsitektur perangkat keras / lunak yang diberikan.

Jika Anda menanggapi kedua pertanyaan dengan positif, Anda harus dapat mengimplementasikan program Anda dengan sedikit usaha sehubungan dengan implementasi CUDA saja. Kemudian Anda dapat membuat profil aplikasi Anda dan memutuskan apakah ada gunanya mencoba meningkatkan kinerja.

Ini mengatakan, saya harus mengakui bahwa saya tidak suka pemrograman "generik", karena saya mau belajar sesuatu yang baru, ketika saya menulis sebuah program. Saya akan mengikuti rute lain: menulis implementasi prototipe dengan python + numpy + scipy, kemudian menambahkan kernel CUDA untuk 1% - 2% dari kode yang benar-benar membutuhkan optimasi dan cocok untuk dijalankan pada GPU. Tentu saja dengan melakukan itu Anda memerlukan semacam pra-sains, karena keputusan yang salah dalam fase prototyping (misalnya struktur data yang tidak cocok untuk kernel CUDA) mungkin memiliki hasil yang mengerikan pada kinerja. Biasanya diperlukan lebih banyak iterasi untuk mendapatkan kode yang baik dan tidak ada jaminan melakukan lebih baik daripada dorongan.

Stefano M
sumber