Apa itu CUDA? Pengaturcaraan selari untuk GPU

CUDA adalah platform pengkomputeran selari dan model pengaturcaraan yang dikembangkan oleh Nvidia untuk pengkomputeran umum pada GPU sendiri (unit pemprosesan grafik). CUDA membolehkan pembangun mempercepat aplikasi intensif komputasi dengan memanfaatkan kekuatan GPU untuk bahagian pengiraan yang dapat dipadankan.

Walaupun ada API lain yang dicadangkan untuk GPU, seperti OpenCL, dan ada GPU yang kompetitif dari syarikat lain, seperti AMD, gabungan GPU CUDA dan Nvidia mendominasi beberapa bidang aplikasi, termasuk pembelajaran mendalam, dan merupakan asas bagi beberapa komputer terpantas di dunia.

Kad grafik boleh dibilang setua PC - iaitu, jika anda menganggap IBM Monochrome Display Adapter 1981 sebagai kad grafik. Menjelang tahun 1988, anda boleh mendapatkan kad VGA Wonder 2D 16-bit dari ATI (syarikat akhirnya diambil alih oleh AMD). Menjelang tahun 1996, anda dapat membeli pemecut grafik 3D dari 3dfx Interactive sehingga anda dapat menjalankan Quake penembak orang pertama dengan kelajuan penuh.

Juga pada tahun 1996, Nvidia mula berusaha untuk bersaing di pasar pemecut 3D dengan produk yang lemah, tetapi belajar seiring dengan berjalannya, dan pada tahun 1999 memperkenalkan GeForce 256 yang berjaya, kad grafik pertama yang dipanggil GPU. Pada masa itu, alasan utama untuk memiliki GPU adalah untuk permainan. Tidak sampai kemudian orang menggunakan GPU untuk matematik, sains, dan kejuruteraan.

Asal CUDA

Pada tahun 2003, satu pasukan penyelidik yang diketuai oleh Ian Buck melancarkan Brook, model pengaturcaraan pertama yang digunakan secara meluas untuk memperluas C dengan konstruk selari data. Buck kemudian bergabung dengan Nvidia dan mengetuai pelancaran CUDA pada tahun 2006, penyelesaian komersial pertama untuk pengkomputeran umum pada GPU.

OpenCL lwn CUDA

Pesaing CUDA OpenCL dilancarkan oleh Apple dan Khronos Group pada tahun 2009, dalam usaha untuk menyediakan standard untuk pengkomputeran heterogen yang tidak terhad pada CPU Intel / AMD dengan GPU Nvidia. Walaupun OpenCL terdengar menarik kerana sifatnya yang umum, ia tidak berfungsi sama seperti CUDA pada GPU Nvidia, dan banyak kerangka pembelajaran mendalam tidak menyokongnya atau hanya menyokongnya sebagai pertimbangan setelah sokongan CUDA mereka dilepaskan.

Peningkatan prestasi CUDA

CUDA telah bertambah baik dan memperluas skopnya selama bertahun-tahun, lebih kurang dengan GPU Nvidia yang lebih baik. Pada versi CUDA 9.2, menggunakan beberapa GPU pelayan P100, anda dapat mewujudkan peningkatan prestasi hingga 50x berbanding CPU. V100 (tidak ditunjukkan dalam gambar ini) 3x lebih pantas untuk beberapa muatan. GPU pelayan generasi sebelumnya, K80, menawarkan peningkatan prestasi 5x hingga 12x berbanding CPU.

Nvidia

Peningkatan kelajuan dari GPU telah tiba pada waktunya untuk pengkomputeran berprestasi tinggi. Peningkatan prestasi single-thread CPU dari masa ke masa, yang disarankan oleh Moore's Law akan berlipat ganda setiap 18 bulan, telah merosot menjadi 10 persen setiap tahun kerana pembuat cip menghadapi had fizikal, termasuk had ukuran pada resolusi topeng cip dan hasil cip semasa proses pembuatan dan had haba pada frekuensi jam pada waktu runtime.

Nvidia

Domain aplikasi CUDA

Nvidia

GPU CUDA dan Nvidia telah diadopsi di banyak bidang yang memerlukan prestasi pengkomputeran titik apungan yang tinggi, seperti yang diringkaskan secara bergambar dalam gambar di atas. Senarai yang lebih lengkap merangkumi:

  1. Kewangan komputasi
  2. Pemodelan iklim, cuaca, dan lautan
  3. Sains dan analisis data
  4. Pembelajaran mendalam dan pembelajaran mesin
  5. Pertahanan dan perisikan
  6. Pembuatan / AEC (Senibina, Kejuruteraan, dan Pembinaan): CAD dan CAE (termasuk dinamika cecair komputasi, mekanik struktur komputasi, reka bentuk dan visualisasi, dan automasi reka bentuk elektronik)
  7. Media dan hiburan (termasuk animasi, pemodelan, dan rendering; pembetulan warna dan pengurusan butir; penyusunan; penamat dan kesan; penyuntingan; pengekodan dan pengedaran digital; grafik udara; alat on-set, ulasan, dan stereo; dan grafik cuaca)
  8. Pengimejan perubatan
  9. Minyak dan gas
  10. Penyelidikan: Pengajian tinggi dan superkomputer (termasuk kimia dan biologi komputasi, analitik berangka, fizik, dan visualisasi saintifik)
  11. Keselamatan
  12. Alat dan pengurusan

CUDA dalam pembelajaran mendalam

Pembelajaran mendalam mempunyai keperluan luar biasa untuk kelajuan pengkomputeran. Sebagai contoh, untuk melatih model untuk Terjemahan Google pada tahun 2016, pasukan Google Brain dan Google Translate melakukan ratusan minggu TensorFlow berjalan menggunakan GPU; mereka telah membeli 2,000 GPU kelas pelayan dari Nvidia untuk tujuan tersebut. Tanpa GPU, latihan tersebut memerlukan masa berbulan-bulan dan bukannya seminggu untuk berkumpul. Untuk penyebaran pengeluaran model terjemahan TensorFlow tersebut, Google menggunakan cip pemprosesan khas baru, TPU (unit pemprosesan tensor).

Selain TensorFlow, banyak kerangka DL lain bergantung pada CUDA untuk sokongan GPU mereka, termasuk Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano, dan Torch. Dalam kebanyakan kes, mereka menggunakan perpustakaan cuDNN untuk pengiraan rangkaian neural yang mendalam. Perpustakaan itu sangat penting untuk latihan kerangka pembelajaran mendalam sehingga semua kerangka kerja yang menggunakan versi cuDNN yang diberikan pada dasarnya mempunyai bilangan prestasi yang sama untuk kes penggunaan yang setara. Apabila CUDA dan cuDNN bertambah baik dari versi ke versi, semua kerangka pembelajaran mendalam yang dikemas kini ke versi baru melihat peningkatan prestasi. Di mana prestasi cenderung berbeza dari kerangka ke kerangka kerja adalah seberapa baik skala mereka ke beberapa GPU dan beberapa nod.

Pengaturcaraan CUDA

Nvidia

Kit Alat CUDA

Toolkit CUDA merangkumi perpustakaan, alat debug dan pengoptimuman, penyusun, dokumentasi, dan perpustakaan runtime untuk menyebarkan aplikasi anda. Ia mempunyai komponen yang menyokong pembelajaran mendalam, aljabar linear, pemprosesan isyarat, dan algoritma selari. Secara umum, perpustakaan CUDA menyokong semua keluarga GPU Nvidia, tetapi menunjukkan prestasi terbaik pada generasi terkini, seperti V100, yang dapat 3 x lebih cepat daripada P100 untuk beban kerja latihan pembelajaran mendalam. Menggunakan satu atau lebih perpustakaan adalah kaedah termudah untuk memanfaatkan GPU, selagi algoritma yang anda perlukan telah dilaksanakan di perpustakaan yang sesuai.

Nvidia

Perpustakaan pembelajaran mendalam CUDA

Dalam bidang pembelajaran mendalam, terdapat tiga perpustakaan utama yang dipercepat GPU: cuDNN, yang saya sebutkan sebelumnya sebagai komponen GPU untuk kebanyakan kerangka pembelajaran mendalam sumber terbuka; TensorRT, yang merupakan pengoptimum dan jangka masa inferensi pembelajaran mendalam prestasi tinggi Nvidia; dan DeepStream, perpustakaan inferensi video. TensorRT membantu anda mengoptimumkan model rangkaian neural, menentukur untuk ketepatan yang lebih rendah dengan ketepatan tinggi, dan menyebarkan model terlatih ke awan, pusat data, sistem tertanam, atau platform produk automotif.

Nvidia

Perpustakaan aljabar dan matematik CUDA linear

Aljabar linear menyokong pengiraan tensor dan oleh itu pembelajaran mendalam. BLAS (Basic Linear Algebra Subprograms), kumpulan algoritma matriks yang dilaksanakan di Fortran pada tahun 1989, telah digunakan sejak itu oleh saintis dan jurutera. cuBLAS adalah versi BLAS yang dipercepat GPU, dan cara berprestasi tertinggi untuk melakukan aritmetik matriks dengan GPU. cuBLAS menganggap bahawa matriks padat; cuSPARSE mengendalikan matriks jarang.

Nvidia

Perpustakaan memproses isyarat CUDA

Transformasi Fourier pantas (FFT) adalah salah satu algoritma asas yang digunakan untuk pemprosesan isyarat; ia mengubah isyarat (seperti bentuk gelombang audio) menjadi spektrum frekuensi. cuFFT adalah FFT yang dipercepat GPU.

Codec, menggunakan standard seperti H.264, encode / compress dan decode / decompress video untuk penghantaran dan paparan. Nvidia Video Codec SDK mempercepat proses ini dengan GPU.

Nvidia

Perpustakaan algoritma selari CUDA

Ketiga-tiga perpustakaan untuk algoritma selari semuanya mempunyai tujuan yang berbeza. NCCL (Perpustakaan Komunikasi Kolektif Nvidia) adalah untuk menskalakan aplikasi di pelbagai GPU dan nod; nvGRAPH adalah untuk analisis grafik selari; dan Thrust adalah pustaka templat C ++ untuk CUDA berdasarkan Pustaka Templat Piawai C ++. Thrust menyediakan koleksi primitif selari data yang kaya seperti imbasan, susun dan kurangkan.

Nvidia

Prestasi CUDA vs CPU

Dalam beberapa kes, anda boleh menggunakan fungsi CUDA drop-in dan bukannya fungsi CPU yang setara. Sebagai contoh, rutin pendaraban matriks GEMM dari BLAS boleh digantikan dengan versi GPU hanya dengan menghubungkan ke perpustakaan NVBLAS:

Nvidia

Asas pengaturcaraan CUDA

Sekiranya anda tidak dapat menemui rutin perpustakaan CUDA untuk mempercepat program anda, anda harus mencuba program CUDA tahap rendah. Itu jauh lebih mudah sekarang daripada ketika saya pertama kali mencubanya pada akhir 2000 Antara sebab lain, ada sintaks yang lebih mudah dan ada alat pengembangan yang lebih baik tersedia. Satu-satunya masalah saya ialah pada MacOS penyusun CUDA terbaru dan penyusun C ++ terbaru (dari Xcode) jarang diselaraskan. Seseorang harus memuat turun alat baris perintah yang lebih lama dari Apple dan beralih ke mereka menggunakan xcode-selectuntuk mendapatkan kod CUDA untuk menyusun dan menghubungkan.

Sebagai contoh, pertimbangkan rutin C / C ++ sederhana ini untuk menambahkan dua tatasusunan:

tambah tambah (int n, float * x, float * y)

{  

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

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

}

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

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

Anda juga harus menukar malloc/ newdan free/ deletepanggilan ke cudaMallocManageddan cudaFreesupaya anda memperuntukkan ruang pada GPU. Akhirnya, anda perlu menunggu pengiraan GPU selesai sebelum menggunakan hasil pada CPU, yang dapat anda capai cudaDeviceSynchronize.

Pendakap tiga di atas menggunakan satu blok utas dan satu utas. GPU Nvidia semasa dapat menangani banyak blok dan utas. Sebagai contoh, GPU Tesla P100 berdasarkan Pascal GPU Architecture mempunyai 56 Streaming Multiprocessors (SM), masing-masing mampu menyokong sehingga 2048 utas aktif.

Kod kernel perlu mengetahui indeks blok dan utasnya untuk mencari pengimbangannya ke dalam tatasusunan lulus. Kernel selari sering menggunakan gelung grid-stride , seperti yang berikut:

__ global__

tambah tambah (int n, float * x, float * y)

{

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

   int stride = blockDim.x * gridDim.x;

   untuk (int i = indeks; i <n; i + = langkah)

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

}

Sekiranya anda melihat contoh dalam CUDA Toolkit, anda akan melihat bahawa ada lebih banyak perkara yang perlu dipertimbangkan daripada asas-asas yang saya bahas di atas. Sebagai contoh, beberapa panggilan fungsi CUDA perlu dibungkus dalam checkCudaErrors()panggilan. Juga, dalam banyak kes, kod terpantas akan menggunakan perpustakaan seperti cuBLASbersama dengan peruntukan memori hos dan peranti dan menyalin matriks berulang-ulang.

Ringkasnya, anda dapat mempercepat aplikasi anda dengan GPU di pelbagai peringkat. Anda boleh menulis kod CUDA; anda boleh memanggil perpustakaan CUDA; dan anda boleh menggunakan aplikasi yang sudah menyokong CUDA.