CUDA nedir? GPU'lar için paralel programlama

CUDA, Nvidia tarafından kendi GPU'larında (grafik işleme birimleri) genel bilgi işlem için geliştirilmiş paralel bir hesaplama platformu ve programlama modelidir. CUDA, geliştiricilerin hesaplamanın paralelleştirilebilir kısmı için GPU'ların gücünden yararlanarak yoğun hesaplama gerektiren uygulamaları hızlandırmalarına olanak tanır.

OpenCL gibi GPU'lar için önerilen başka API'ler varken, AMD gibi diğer şirketlerin rekabetçi GPU'ları varken, CUDA ve Nvidia GPU'ların kombinasyonu, derin öğrenme dahil olmak üzere çeşitli uygulama alanlarına hakimdir ve bazıları için bir temel oluşturur. dünyadaki en hızlı bilgisayarlar.

Grafik kartları tartışmasız PC kadar eskidir - yani, 1981 IBM Tek Renkli Görüntü Adaptörünü bir grafik kartı olarak kabul ediyorsanız. 1988'de, ATI'den (şirket sonunda AMD tarafından satın alındı) 16 bitlik bir 2D VGA Wonder kartı alabiliyordunuz. 1996'da, birinci şahıs nişancı Quake'i tam hızda çalıştırabilmek için 3dfx Interactive'den bir 3B grafik hızlandırıcı satın alabiliyordunuz.

Yine 1996'da Nvidia, zayıf ürünlerle 3D hızlandırıcı pazarında rekabet etmeye başladı, ancak gittikçe öğrendi ve 1999'da GPU olarak adlandırılan ilk grafik kartı olan başarılı GeForce 256'yı tanıttı. O zamanlar, bir GPU'ya sahip olmanın temel nedeni oyun oynamaktı. İnsanların matematik, bilim ve mühendislik için GPU'ları kullanması daha sonraya kadar değildi.

CUDA'nın kökeni

2003 yılında, Ian Buck liderliğindeki bir araştırma ekibi, C'yi veri paralel yapılarla genişletmek için yaygın olarak benimsenen ilk programlama modeli olan Brook'u açıkladı. Buck daha sonra Nvidia'ya katıldı ve GPU'larda genel amaçlı bilgi işlem için ilk ticari çözüm olan CUDA'nın 2006 yılında piyasaya sürülmesine öncülük etti.

OpenCL ve CUDA

CUDA rakibi OpenCL, Nvidia GPU'lu Intel / AMD CPU'larla sınırlı olmayan heterojen bilgi işlem için bir standart sağlamak amacıyla 2009 yılında Apple ve Khronos Group tarafından piyasaya sürüldü. OpenCL, genelliği nedeniyle çekici görünse de, Nvidia GPU'larda CUDA kadar iyi performans göstermedi ve birçok derin öğrenme çerçevesi ya onu desteklemiyor ya da yalnızca CUDA desteği yayınlandıktan sonra sonradan destekleniyor.

CUDA performans artışı

CUDA, geliştirilmiş Nvidia GPU'ları ile yıllar içinde kapsamını az ya da çok geliştirdi ve genişletti. CUDA sürüm 9.2'den itibaren, birden fazla P100 sunucu GPU kullanarak, CPU'lara göre 50 kata kadar performans iyileştirmeleri gerçekleştirebilirsiniz. V100 (bu şekilde gösterilmemiştir) bazı yükler için 3 kat daha hızlıdır. Önceki nesil sunucu GPU'ları olan K80, CPU'lara göre 5 ila 12 kat arasında performans iyileştirmeleri sunuyordu.

Nvidia

GPU'lardan gelen hız artışı, yüksek performanslı bilgi işlem için çok kısa sürede geldi. Moore Yasası'nın her 18 ayda bir ikiye katlayacağını öne sürdüğü CPU'ların zaman içinde tek iş parçacıklı performans artışı, yonga üreticilerinin üretim sürecinde yonga maskesi çözünürlüğünde boyut sınırları ve yonga verimi dahil olmak üzere fiziksel sınırlarla karşılaşmasıyla yılda yüzde 10'a düştü. ve çalışma zamanında saat frekanslarında ısı limitleri.

Nvidia

CUDA uygulama alanları

Nvidia

CUDA ve Nvidia GPU'lar, yukarıdaki resimde resimsel olarak özetlendiği gibi, yüksek kayan nokta hesaplama performansına ihtiyaç duyan birçok alanda benimsenmiştir. Daha kapsamlı bir liste şunları içerir:

  1. Hesaplamalı finans
  2. İklim, hava durumu ve okyanus modellemesi
  3. Veri bilimi ve analizi
  4. Derin öğrenme ve makine öğrenimi
  5. Savunma ve istihbarat
  6. İmalat / AEC (Mimari, Mühendislik ve İnşaat): CAD ve CAE (hesaplamalı akışkanlar dinamiği, hesaplamalı yapısal mekanik, tasarım ve görselleştirme ve elektronik tasarım otomasyonu dahil)
  7. Medya ve eğlence (animasyon, modelleme ve oluşturma dahil; renk düzeltme ve gren yönetimi; birleştirme; sonlandırma ve efektler; düzenleme; kodlama ve dijital dağıtım; canlı grafikler; sette, inceleme ve stereo araçlar; ve hava durumu grafikleri)
  8. Tıbbi Görüntüleme
  9. Yağ ve gaz
  10. Araştırma: Yüksek öğretim ve süper hesaplama (hesaplamalı kimya ve biyoloji, sayısal analitik, fizik ve bilimsel görselleştirme dahil)
  11. Emniyet ve güvenlik
  12. Araçlar ve yönetim

Derin öğrenmede CUDA

Derin öğrenmenin bilgi işlem hızına çok büyük bir ihtiyacı vardır. Örneğin, 2016'da Google Translate modellerini eğitmek için Google Brain ve Google Translate ekipleri, GPU'ları kullanarak bir haftalık yüzlerce TensorFlow çalışması yaptı; bu amaçla Nvidia'dan 2.000 sunucu sınıfı GPU satın almışlardı. GPU'lar olmasaydı, bu eğitim çalışmalarının bir araya gelmesi bir hafta yerine aylar alırdı. Bu TensorFlow çeviri modellerinin üretim dağıtımı için Google, yeni bir özel işleme yongası olan TPU (tensör işleme birimi) kullandı.

TensorFlow'a ek olarak, diğer birçok DL çerçevesi, Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano ve Torch dahil olmak üzere GPU desteği için CUDA'ya güveniyor. Çoğu durumda, derin sinir ağı hesaplamaları için cuDNN kitaplığını kullanırlar. Bu kütüphane, derin öğrenme çerçevelerinin eğitimi için o kadar önemlidir ki, belirli bir cuDNN sürümünü kullanan tüm çerçeveler, eşdeğer kullanım durumları için temelde aynı performans numaralarına sahiptir. CUDA ve cuDNN sürümden sürüme geliştiğinde, yeni sürüme güncellenen tüm derin öğrenme çerçeveleri performans kazanımlarını görür. Performansın çerçeveden çerçeveye farklılık gösterme eğiliminde olduğu nokta, birden çok GPU'ya ve birden çok düğüme ne kadar iyi ölçeklendikleri ile ilgilidir.

CUDA programlama

Nvidia

CUDA Araç Seti

CUDA Toolkit, uygulamalarınızı dağıtmak için kitaplıklar, hata ayıklama ve optimizasyon araçları, bir derleyici, belgeler ve bir çalışma zamanı kitaplığı içerir. Derin öğrenmeyi, doğrusal cebiri, sinyal işlemeyi ve paralel algoritmaları destekleyen bileşenlere sahiptir. Genel olarak, CUDA kitaplıkları tüm Nvidia GPU ailelerini destekler, ancak derin öğrenme eğitimi iş yükleri için P100'den 3 kat daha hızlı olabilen V100 gibi en yeni nesilde en iyi performansı gösterir. İhtiyaç duyduğunuz algoritmalar uygun kitaplıkta uygulandığı sürece, bir veya daha fazla kitaplık kullanmak, GPU'lardan yararlanmanın en kolay yoludur.

Nvidia

CUDA derin öğrenme kütüphaneleri

Derin öğrenme alanında, GPU hızlandırmalı üç ana kitaplık vardır: cuDNN, daha önce çoğu açık kaynak derin öğrenme çerçevesi için GPU bileşeni olarak bahsetmiştim; Nvidia'nın yüksek performanslı derin öğrenme çıkarım iyileştiricisi ve çalışma zamanı olan TensorRT; ve bir video çıkarım kitaplığı olan DeepStream. TensorRT, sinir ağı modellerini optimize etmenize, yüksek doğrulukla daha düşük hassasiyet için kalibre etmenize ve eğitimli modelleri bulutlara, veri merkezlerine, gömülü sistemlere veya otomotiv ürün platformlarına dağıtmanıza yardımcı olur.

Nvidia

CUDA doğrusal cebir ve matematik kütüphaneleri

Doğrusal cebir, tensör hesaplamalarının ve dolayısıyla derin öğrenmenin temelini oluşturur. 1989'da Fortran'da uygulanan bir matris algoritmaları koleksiyonu olan BLAS (Temel Doğrusal Cebir Alt Programları), o zamandan beri bilim adamları ve mühendisler tarafından kullanılmaktadır. cuBLAS, BLAS'ın GPU hızlandırmalı bir sürümüdür ve GPU'larla matris aritmetiği yapmanın en yüksek performanslı yoludur. cuBLAS, matrislerin yoğun olduğunu varsayar; cuSPARSE seyrek matrisleri işler.

Nvidia

CUDA sinyal işleme kitaplıkları

Hızlı Fourier dönüşümü (FFT), sinyal işleme için kullanılan temel algoritmalardan biridir; bir sinyali (bir ses dalga biçimi gibi) bir frekans spektrumuna dönüştürür. cuFFT, GPU hızlandırmalı bir FFT'dir.

H.264 gibi standartları kullanan kodekler, aktarım ve görüntüleme için videoyu kodlar / sıkıştırır ve kodunu çözer / açar. Nvidia Video Codec SDK, bu işlemi GPU'larla hızlandırır.

Nvidia

CUDA paralel algoritma kitaplıkları

Paralel algoritmalar için üç kütüphanenin hepsinin farklı amaçları vardır. NCCL (Nvidia Collective Communications Library), uygulamaları birden çok GPU ve düğüm arasında ölçeklendirmek içindir; nvGRAPH paralel grafik analizi içindir; ve Thrust, C ++ Standart Şablon Kitaplığı'na dayalı CUDA için bir C ++ şablon kitaplığıdır. Thrust, tarama, sıralama ve azaltma gibi zengin veri paralel ilkelleri koleksiyonu sağlar.

Nvidia

CUDA ve CPU performansı

Bazı durumlarda, eşdeğer CPU işlevleri yerine drop-in CUDA işlevlerini kullanabilirsiniz. Örneğin, BLAS'ın GEMM matris çarpım rutinleri, yalnızca NVBLAS kitaplığına bağlanarak GPU sürümleriyle değiştirilebilir:

Nvidia

CUDA programlama temelleri

Programlarınızı hızlandırmak için CUDA kitaplık rutinlerini bulamazsanız, düşük seviyeli CUDA programlamasında elinizi denemeniz gerekir. Bu, 2000'lerin sonlarında ilk denediğim zamandan çok daha kolay. Diğer nedenlerin yanı sıra, daha kolay sözdizimi vardır ve daha iyi geliştirme araçları mevcuttur. Tek sözüm, MacOS'ta en son CUDA derleyicisinin ve en son C ++ derleyicisinin (Xcode'dan) nadiren eşzamanlı olmasıdır. Birinin Apple'dan eski komut satırı araçlarını indirmesi ve xcode-selectderlemek ve bağlamak için CUDA kodunu almak için kullanarak bunlara geçiş yapması gerekir .

Örneğin, iki dizi eklemek için bu basit C / C ++ rutini düşünün:

void add (int n, float * x, float * y)

{  

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

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

}

__global__Anahtar kelimeyi bildirime ekleyerek GPU üzerinde çalışacak bir çekirdeğe dönüştürebilir ve üçlü parantez sözdizimini kullanarak çekirdeği çağırabilirsiniz:

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

Ayrıca malloc/ newve free/ deletearamalarınızı da değiştirmelisiniz cudaMallocManagedve cudaFreeböylece GPU'da yer ayırmış olursunuz. Son olarak, CPU üzerindeki sonuçları kullanmadan önce GPU hesaplamasının tamamlanmasını beklemeniz gerekir ki bunu başarabilirsiniz cudaDeviceSynchronize.

Yukarıdaki üçlü braket, bir diş bloğu ve bir diş kullanır. Mevcut Nvidia GPU'lar birçok bloğu ve iş parçacığı işleyebilir. Örneğin, Pascal GPU Mimarisine dayalı bir Tesla P100 GPU, her biri 2048'e kadar aktif iş parçacığı destekleyebilen 56 Akış Çok İşlemciye (SM) sahiptir.

Çekirdek kodunun, geçirilen dizilerdeki ofsetini bulmak için blok ve iş parçacığı indeksini bilmesi gerekir. Paralelleştirilmiş çekirdek genellikle aşağıdaki gibi bir ızgara-adım döngüsü kullanır :

__global__

void add (int n, float * x, float * y)

{

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

   int stride = blockDim.x * gridDim.x;

   for (int i = indeks; i <n; i + = adım)

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

}

CUDA Araç Seti'ndeki örneklere bakarsanız, yukarıda ele aldığım temel konulardan daha fazlasını dikkate almanız gerektiğini göreceksiniz. Örneğin, bazı CUDA işlev çağrılarının çağrılara sarılması gerekir checkCudaErrors(). Ayrıca, çoğu durumda en hızlı kod cuBLAS, ana bilgisayar ve cihaz hafızası tahsisi ve matrislerin ileri geri kopyalanması gibi kitaplıkları kullanır .

Özetle uygulamalarınızı GPU'larla birçok düzeyde hızlandırabilirsiniz. CUDA kodunu yazabilirsiniz; CUDA kitaplıklarını arayabilirsiniz; ve zaten CUDA'yı destekleyen uygulamaları kullanabilirsiniz.