Apa itu CUDA? Pemrograman paralel untuk GPU

CUDA adalah platform komputasi paralel dan model pemrograman yang dikembangkan oleh Nvidia untuk komputasi umum pada GPU-nya sendiri (unit pemrosesan grafis). CUDA memungkinkan pengembang untuk mempercepat aplikasi intensif komputasi dengan memanfaatkan kekuatan GPU untuk bagian komputasi yang dapat diparalelkan.

Meskipun ada API lain yang diusulkan untuk GPU, seperti OpenCL, dan ada GPU kompetitif dari perusahaan lain, seperti AMD, kombinasi GPU CUDA dan Nvidia mendominasi beberapa area aplikasi, termasuk pembelajaran mendalam, dan merupakan fondasi untuk beberapa komputer tercepat di dunia.

Kartu grafis bisa dibilang setua PC — yaitu, jika Anda menganggap IBM Monochrome Display Adapter 1981 sebagai kartu grafis. Pada tahun 1988, Anda bisa mendapatkan kartu Wonder VGA 2D 16-bit dari ATI (perusahaan yang akhirnya diakuisisi oleh AMD). Pada tahun 1996, Anda dapat membeli akselerator grafis 3D dari 3dfx Interactive sehingga Anda dapat menjalankan Quake penembak orang pertama dengan kecepatan penuh.

Juga pada tahun 1996, Nvidia mulai mencoba bersaing di pasar akselerator 3D dengan produk-produk yang lemah, tetapi belajar sambil berjalan, dan pada tahun 1999 memperkenalkan GeForce 256 yang sukses, kartu grafis pertama yang disebut GPU. Pada saat itu, alasan utama memiliki GPU adalah untuk bermain game. Baru kemudian orang menggunakan GPU untuk matematika, sains, dan teknik.

Asal usul CUDA

Pada tahun 2003, tim peneliti yang dipimpin oleh Ian Buck meluncurkan Brook, model pemrograman pertama yang diadopsi secara luas untuk memperluas C dengan konstruksi paralel data. Buck kemudian bergabung dengan Nvidia dan memimpin peluncuran CUDA pada tahun 2006, solusi komersial pertama untuk komputasi serba guna pada GPU.

OpenCL vs. CUDA

Kompetitor CUDA OpenCL diluncurkan oleh Apple dan Khronos Group pada tahun 2009, dalam upaya menyediakan standar untuk komputasi heterogen yang tidak terbatas pada CPU Intel / AMD dengan GPU Nvidia. Meskipun OpenCL terdengar menarik karena umumnya, ia tidak berkinerja sebaik CUDA pada GPU Nvidia, dan banyak kerangka kerja pembelajaran mendalam yang tidak mendukungnya atau mendukungnya hanya sebagai renungan setelah dukungan CUDA mereka dirilis.

Peningkatan kinerja CUDA

CUDA telah meningkatkan dan memperluas cakupannya selama bertahun-tahun, kurang lebih sejalan dengan peningkatan GPU Nvidia. Mulai CUDA versi 9.2, dengan menggunakan beberapa GPU server P100, Anda dapat mewujudkan peningkatan kinerja hingga 50x lipat dari CPU. V100 (tidak diperlihatkan dalam gambar ini) adalah 3x lebih cepat untuk beberapa beban. GPU server generasi sebelumnya, K80, menawarkan peningkatan kinerja 5x hingga 12x lipat dari CPU.

Nvidia

Peningkatan kecepatan dari GPU telah tiba pada waktunya untuk komputasi kinerja tinggi. Peningkatan kinerja single-threaded CPU dari waktu ke waktu, yang menurut Hukum Moore akan berlipat ganda setiap 18 bulan, telah melambat menjadi 10 persen per tahun karena pembuat chip mengalami batasan fisik, termasuk batasan ukuran pada resolusi topeng chip dan hasil chip selama proses manufaktur. dan batas panas pada frekuensi clock saat runtime.

Nvidia

Domain aplikasi CUDA

Nvidia

GPU CUDA dan Nvidia telah diadopsi di banyak area yang membutuhkan kinerja komputasi floating-point tinggi, seperti yang dirangkum dalam gambar di atas. Daftar yang lebih lengkap meliputi:

  1. Keuangan komputasi
  2. Pemodelan iklim, cuaca, dan lautan
  3. Ilmu data dan analitik
  4. Pembelajaran mendalam dan pembelajaran mesin
  5. Pertahanan dan intelijen
  6. Manufaktur / AEC (Arsitektur, Teknik, dan Konstruksi): CAD dan CAE (termasuk dinamika fluida komputasi, mekanika struktural komputasi, desain dan visualisasi, dan otomatisasi desain elektronik)
  7. Media dan hiburan (termasuk animasi, pemodelan, dan rendering; koreksi warna dan manajemen butiran; pengomposisian; penyelesaian dan efek; pengeditan; pengkodean dan distribusi digital; grafik on-air; alat on-set, review, dan stereo; dan grafik cuaca)
  8. Pencitraan medis
  9. Minyak dan gas
  10. Penelitian: Pendidikan tinggi dan superkomputer (termasuk kimia komputasi dan biologi, analitik numerik, fisika, dan visualisasi ilmiah)
  11. Keselamatan dan keamanan
  12. Alat dan manajemen

CUDA dalam pembelajaran mendalam

Pembelajaran mendalam memiliki kebutuhan yang sangat besar untuk kecepatan komputasi. Misalnya, untuk melatih model Google Terjemahan pada tahun 2016, tim Google Brain dan Google Terjemahan melakukan ratusan operasi TensorFlow selama satu minggu menggunakan GPU; mereka telah membeli 2.000 GPU tingkat server dari Nvidia untuk tujuan tersebut. Tanpa GPU, proses pelatihan tersebut akan memakan waktu berbulan-bulan daripada seminggu untuk berkumpul. Untuk penerapan produksi model terjemahan TensorFlow tersebut, Google menggunakan chip pemrosesan kustom baru, TPU (unit pemrosesan tensor).

Selain TensorFlow, banyak framework DL lainnya yang mengandalkan CUDA untuk dukungan GPU mereka, termasuk Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano, dan Torch. Dalam kebanyakan kasus, mereka menggunakan pustaka cuDNN untuk komputasi jaringan neural dalam. Library tersebut sangat penting untuk pelatihan framework deep learning sehingga semua framework yang menggunakan versi cuDNN pada dasarnya memiliki angka performa yang sama untuk kasus penggunaan yang setara. Saat CUDA dan cuDNN meningkat dari versi ke versi, semua kerangka kerja pembelajaran mendalam yang diperbarui ke versi baru melihat peningkatan performa. Di mana kinerjanya cenderung berbeda dari satu framework ke framework lainnya, terletak pada seberapa baik skalanya ke beberapa GPU dan banyak node.

Pemrograman CUDA

Nvidia

Perangkat CUDA

CUDA Toolkit mencakup pustaka, alat debugging dan pengoptimalan, kompiler, dokumentasi, dan pustaka runtime untuk menerapkan aplikasi Anda. Ini memiliki komponen yang mendukung pembelajaran mendalam, aljabar linier, pemrosesan sinyal, dan algoritma paralel. Secara umum, pustaka CUDA mendukung semua keluarga GPU Nvidia, tetapi berkinerja terbaik pada generasi terbaru, seperti V100, yang bisa 3x lebih cepat daripada P100 untuk beban kerja pelatihan deep learning. Menggunakan satu atau beberapa pustaka adalah cara termudah untuk memanfaatkan GPU, selama algoritme yang Anda butuhkan telah diterapkan di pustaka yang sesuai.

Nvidia

Perpustakaan pembelajaran mendalam CUDA

Dalam lingkup pembelajaran mendalam, ada tiga pustaka utama yang dipercepat GPU: cuDNN, yang saya sebutkan sebelumnya sebagai komponen GPU untuk sebagian besar kerangka kerja pembelajaran dalam sumber terbuka; TensorRT, yang merupakan waktu proses dan pengoptimal inferensi deep learning performa tinggi dari Nvidia; dan DeepStream, perpustakaan inferensi video. TensorRT membantu Anda mengoptimalkan model jaringan neural, mengkalibrasi untuk presisi yang lebih rendah dengan akurasi tinggi, dan menerapkan model terlatih ke cloud, pusat data, sistem tersemat, atau platform produk otomotif.

Nvidia

Perpustakaan aljabar dan matematika linier CUDA

Aljabar linier mendasari perhitungan tensor dan pembelajaran mendalam. BLAS (Basic Linear Algebra Subprograms), kumpulan algoritma matriks yang diterapkan di Fortran pada tahun 1989, telah digunakan sejak saat itu oleh para ilmuwan dan insinyur. cuBLAS adalah versi BLAS dengan akselerasi GPU, dan cara berperforma tertinggi untuk melakukan aritmatika matriks dengan GPU. cuBLAS mengasumsikan bahwa matriksnya padat; cuSPARSE menangani matriks jarang.

Nvidia

Perpustakaan pemrosesan sinyal CUDA

Fast Fourier Transform (FFT) adalah salah satu algoritma dasar yang digunakan untuk pemrosesan sinyal; itu mengubah sinyal (seperti bentuk gelombang audio) menjadi spektrum frekuensi. cuFFT adalah FFT dengan akselerasi GPU.

Codec, menggunakan standar seperti H.264, encode / compress dan decode / decompress video untuk transmisi dan tampilan. Nvidia Video Codec SDK mempercepat proses ini dengan GPU.

Nvidia

Perpustakaan algoritma paralel CUDA

Ketiga pustaka untuk algoritme paralel semuanya memiliki tujuan yang berbeda. NCCL (Nvidia Collective Communications Library) adalah untuk aplikasi penskalaan di beberapa GPU dan node; nvGRAPH adalah untuk analitik grafik paralel; dan Thrust adalah pustaka template C ++ untuk CUDA berdasarkan C ++ Pustaka Template Standar. Thrust menyediakan banyak koleksi data paralel primitif seperti scan, sort, dan reduce.

Nvidia

CUDA vs. kinerja CPU

Dalam beberapa kasus, Anda dapat menggunakan fungsi CUDA drop-in daripada fungsi CPU yang setara. Misalnya, rutinitas perkalian matriks GEMM dari BLAS dapat diganti dengan versi GPU hanya dengan menautkan ke pustaka NVBLAS:

Nvidia

Dasar-dasar pemrograman CUDA

Jika Anda tidak dapat menemukan rutinitas perpustakaan CUDA untuk mempercepat program Anda, Anda harus mencoba pemrograman CUDA tingkat rendah. Itu jauh lebih mudah sekarang daripada ketika saya pertama kali mencobanya di akhir tahun 2000-an. Di antara alasan lain, ada sintaks yang lebih mudah dan tersedia alat pengembangan yang lebih baik. Satu-satunya pertanyaan saya adalah bahwa di MacOS, kompiler CUDA terbaru dan kompiler C ++ terbaru (dari Xcode) jarang selaras. Seseorang harus mengunduh alat baris perintah yang lebih lama dari Apple dan beralih ke mereka menggunakan xcode-selectuntuk mendapatkan kode CUDA untuk dikompilasi dan ditautkan.

Misalnya, pertimbangkan rutin C / C ++ sederhana ini untuk menambahkan dua array:

batal tambahkan (int n, float * x, float * y)

{  

       untuk (int i = 0; i <n; i ++)      

             y [i] = x [i] + y [i];

}

Anda dapat mengubahnya menjadi kernel yang akan berjalan di GPU dengan menambahkan __global__kata kunci ke deklarasi, dan memanggil kernel dengan menggunakan sintaks braket tiga kali lipat:

tambahkan << >> (N, x, y);

Anda juga harus mengubah malloc/ newdan free/ deletepanggilan ke cudaMallocManageddan cudaFreesehingga Anda mengalokasikan ruang pada GPU. Terakhir, Anda perlu menunggu kalkulasi GPU selesai sebelum menggunakan hasil pada CPU, yang dapat Anda selesaikan cudaDeviceSynchronize.

Braket rangkap tiga di atas menggunakan satu blok ulir dan satu ulir. GPU Nvidia saat ini dapat menangani banyak blok dan utas. Misalnya, Tesla P100 GPU berdasarkan Pascal GPU Architecture memiliki 56 Streaming Multiprocessors (SM), masing-masing mampu mendukung hingga 2048 thread aktif.

Kode kernel perlu mengetahui indeks blok dan utasnya untuk menemukan offsetnya ke dalam array yang dilewati. Kernel yang diparalelkan sering kali menggunakan loop langkah-grid , seperti berikut ini:

__global__

batal tambahkan (int n, float * x, float * y)

{

   int index = blockIdx.x * blockDim.x + threadIdx.x;

   int langkah = blockDim.x * gridDim.x;

   untuk (int i = index; i <n; i + = stride)

     y [i] = x [i] + y [i];

}

Jika Anda melihat contoh di CUDA Toolkit, Anda akan melihat bahwa ada lebih banyak hal yang perlu dipertimbangkan daripada dasar-dasar yang saya bahas di atas. Misalnya, beberapa panggilan fungsi CUDA perlu digabungkan dalam checkCudaErrors()panggilan. Selain itu, dalam banyak kasus, kode tercepat akan menggunakan pustaka seperti cuBLASbersama dengan alokasi memori host dan perangkat serta menyalin matriks bolak-balik.

Singkatnya, Anda dapat mempercepat aplikasi Anda dengan GPU di berbagai tingkatan. Anda dapat menulis kode CUDA; Anda dapat memanggil perpustakaan CUDA; dan Anda dapat menggunakan aplikasi yang sudah mendukung CUDA.