Yapay zekadan makale özeti
- Kısa
- Ayrıntılı
- Bu video, bir eğitmen tarafından sunulan CUDA programlama dili hakkında kapsamlı bir eğitim dersidir. Eğitmen, GPU programlamasının temel kavramlarını ve CUDA dilini detaylı şekilde anlatmaktadır.
- Video, CUDA programlamasının temel kavramlarından başlayarak, veri aktarımı, hafıza yönetimi, unified memory kullanımı, grid ve block yapısı, thread id'leri ve paralel hesaplama mantığı gibi konuları ele almaktadır. Eğitmen, örnek kodlar üzerinden CUDA programlarının nasıl yazılacağını, derlenip çalıştırılacağını ve GPU özelliklerinin nasıl inceleneceğini göstermektedir.
- Eğitim içeriğinde ayrıca GPU ve CPU arasındaki farklar, GPU'nun paralel işlem yapabilme kapasitesi, hafıza türleri (constant memory, shared memory), bloklar arasındaki senkronizasyon ve thread'lerin haberleşme yöntemleri gibi teknik konular da detaylı şekilde açıklanmaktadır. Video boyunca izleyicilerin soruları yanıtlanarak interaktif bir şekilde ilerlemektedir.
- 00:07CUDA Programlama Dili
- CUDA, GPU'lar üzerinde yazılabilen ve esnek olan bir programlama dilidir.
- Python gibi yüksek seviye dillerle bile GPU'ya kod yazılabilir, ancak bazen C'e benzer yapılar kullanmak gerekebilir.
- MPI gibi diğer paralel programlama kütüphaneleriyle de CUDA kodu yazılabilir.
- 01:01Vektör Toplama Örneği
- Vektör toplama işlemi, GPU programlamasında sık kullanılan ve hız açısından önemli bir örnek olarak gösterilmiştir.
- Bu işlem, bir yazılımın çalışma zamanının %10-20'ini alabilecek kadar önemli olabilir.
- CPU'da bu işlem kolayca bir veya iki satır kodla yapılabilir, ancak GPU'da daha karmaşık bir süreç gerektirir.
- 02:50CUDA'da İşlem Aşamaları
- CUDA'da bir işlem için üç temel adım vardır: veriyi host'tan device'a aktarma, hesaplama yapma ve sonucu host'a geri aktarma.
- CUDA 6'dan sonra işler daha kolay hale gelmiştir.
- Bu üç aşamayı anlamanın, donanım özelliklerini bilmeden bile CUDA programlamasının temelini kavramak için yeterli olduğu belirtilmiştir.
- 04:37CUDA Donanım Yapısı
- CUDA'da bilgisayar ve ekran kartı arasında ayrım vardır; ekran kartı üzerinde çalışan kod, device için özel derleyici tarafından derlenir.
- Ekran kartı üzerindeki thread'ler kendi yazmaçlarına ve ortak ana hafızaya erişebilir.
- Host tarafı, device tarafındaki hafızaya doğrudan erişemez, ancak CUDA fonksiyonları aracılığıyla veri aktarabilir.
- 05:38CUDA Hafıza İşlemleri
- CUDAMalloc fonksiyonu, global memory'den istenen uzunlukta hafıza alanı açar ve pointer döndürür.
- CUDAFree fonksiyonu, CUDAMalloc ile açılan hafıza alanını serbest bırakır.
- CUDAMemcpy fonksiyonu, veriyi host ile device arasında aktarır ve dört parametre alır: verinin boyutu, kaynak, hedef ve transfer yönü.
- 08:11Vektör Toplama Örneğinin Kodlanması
- Örnek kodda, host'ta bulunan A ve B vektörleri ile C vektörü için hafıza ayrılır.
- CUDAMalloc ile device üzerinde hafıza alanı açılır ve CUDAMemcpy ile veriler aktarılır.
- İşlem tamamlandıktan sonra, sonucu host'a geri aktarır ve CUDAFree ile device üzerindeki hafıza serbest bırakılır.
- 12:06CUDA Curnal ve Senkronizasyon
- CUDA'da curnal invocation, GPU üzerinde çalışan fonksiyonlardır.
- Non-blocking durumunda host'tan device'a giden kodun çıktısı host tarafında kullanılmayabilir, bu nedenle senkronizasyon fonksiyonu çağrılmalıdır.
- Device senkronizasyonu, device üzerindeki tüm işlemlerin bitmesini bekleyerek senkronizasyon sağlar.
- 13:54Unified Memory Kavramı
- CUDA'da unified memory, verinin iki kopyasını tutmamayı sağlar; host ve device üzerinde aynı veriye erişim sağlanır.
- CUDA malloc managed, verinin bir kopyasını tutar ve ihtiyaç duyulduğunda sayfa sayfa (page) veri transferi yapar.
- On-demand page migration, GPU'nun sadece gerekli sayfaları getirmesini sağlar, böylece verinin tamamını kopyalamaya gerek kalmaz.
- 15:44Unified Memory Avantajları
- CUDA malloc managed ile flag'ler kullanılarak verinin asıl yeri belirlenebilir (host veya device'da durması istenebilir).
- Prefetching, veri istemeyi anında değil önceden yaparak hesaplama ve veri iletişimi işlemlerini üst üste binmesini engeller.
- Unified memory, veri güncellemelerinin otomatik olarak halledilmesini sağlar ve hem host hem device kodunda kullanılabilir.
- 18:10Unified Memory Kullanımı
- CUDA malloc yerine CUDA malloc managed kullanıldığında, veri kopyalama işlemleri otomatikleştirilir ve kod daha az karmaşık hale gelir.
- Vektör toplama gibi işlemlerde unified memory kullanımı performans açısından zararlı olmayabilir.
- Compute capability 6.x'den önce unified memory'nin etkinliğini geliştirecek donanım parçası yoktu, bu nedenle tüm blok kopyalanmak zorundaydı.
- 21:11CUDA Malloc ve Malloc Managed Karşılaştırması
- Vektör toplama gibi veri bir kere giden ve tekrar tekrar erişilmeyecek işlemlerde CUDA malloc managed tercih edilebilir.
- Karmaşık işlemlerde (öz değer hesaplaması, matris işlemleri gibi) verinin asıl kopyasının device'da durması daha faydalı olabilir.
- Konuşmacı kendi kontrolünde olduğu için genellikle CUDA malloc kullanmayı tercih ediyor, ancak unified memory kodu yazmayı kolaylaştırıyor.
- 23:14GPU Hatalarını Tanıma ve İzleme
- GPU'lar hataları bildirmek için karmaşık olabilir; bazen kod bittiğini söylerken hata mesajı vermez.
- GPU fonksiyonları (cudaMalloc, cudaMemcpy gibi) özellikle blocking (sincronize) olanlar hata mesajları verir ve cudaSuccess gibi tanımlar kullanır.
- Makro tanımları kullanarak her fonksiyon çağrısının hata kontrolünü otomatikleştirebilirsiniz.
- 25:33GPU Hata Ayıklama ve Profiling
- GPU hata ayıklaması CPU'ya göre daha zordur çünkü GPU mimarisi çok daha karmaşıktır.
- Görsel olarak gelişmiş araçlar var ancak bugün komut satırından hata ayıklama yöntemlerini inceleyeceğiz.
- GPU kodlarında önemli bir gözlem: GPU uygun algoritma tipi, aynı işlemi farklı verilerle paralel olarak çalıştırmak için uygundur.
- 28:36CUDA Kernel Çağrısı ve Thread Yapıları
- CUDA kernel çağrısı, GPU'da çalışacak fonksiyonları çalıştırmak için kullanılır ve özel bir sözdizimiyle yapılır.
- Grid, blok ve thread yapısı: Grid, bloklardan oluşur, bloklar ise threadlerden oluşur.
- Grid boyutu ve blok boyutu belirlerken 1 boyutlu, 2 boyutlu veya 3 boyutlu yapılar kullanılabilir.
- 32:27CPU ve GPU Arasındaki Farklar
- CPU ve GPU farklı komut kümelerine sahiptir ve hafızada okuma-yazma işlemlerini gerçekleştirir.
- CPU'lar daha çok von Neumann modeline benzerken, GPU'lar bu modelden farklıdır.
- 33:13İşlemci ve Kontrol Birimi
- Kod hafızada durur ve program counter hangi komutun getirileceğini belirler.
- Instruction register komutu saklar, işlemci üzerinde analiz yapar ve control unit'e ne yapacağını söyler.
- İşlemci veriyi hafızadan alır, registerlarına koyar ve işlemi gerçekleştirir.
- 34:07GPU'da İşlem Birimleri
- GPU'da kontrol birimi birden fazla işlem birimini kontrol eder ve hepsi aynı hafızayı kullanır.
- Tek bir kontrol birimi tarafından kontrol edilen tüm işlem birimleri aynı komutu kullanmak zorundadır.
- İşlem birimleri aynı komutu farklı verilerle çalıştırır, örneğin vektör toplama işleminde.
- 35:16CUDA ve Thread Yapısı
- CUDA thread'leri grid (ağı) şeklinde çalıştırılır ve üç boyutlu veya iki boyutlu olabilir.
- Grid içindeki tüm thread'ler aynı kodu çalıştırır, sadece bir satır kod var ve tüm thread'ler onu çalıştırır.
- CPU'da vector edition için for loop kullanılırken, GPU'da döngü yerine thread'lerin hesapladığı sayı veri elemanını belirler.
- 37:23Thread ve Blok Yapısı
- GPU'da thread'ler bloklara, bloklar gridlere yerleştirilir.
- Bir blok içinde thread'ler yerel ID'lerine sahiptir ve bloklar grid içinde global ID'lerine sahiptir.
- Vektör uzunluğu blok kapasitesinden büyükse, grid içinde birden fazla blok oluşturulur.
- 38:51Global ID Hesaplama
- Thread'lerin global ID'si, blok ID'si, blok boyutu ve thread ID'si kullanılarak hesaplanır.
- Global ID, thread'in hangi c'nin hangi indisine yazacağı bilgisini içerir.
- Farklı bloklardaki thread'ler farklı global ID'lere sahip olur ve bu sayede aynı vektörün farklı değerlerini hesaplarlar.
- 43:54CUDA Donanım Yapısı
- Aynı device'da bir blok başka işlem yaparken ikinci blok da aynı anda başka işlem yapabilir.
- Device, tek parça bir donanım değil, içinde streaming multi processor (prosesör) adı verilen birçok işlemci bulunur.
- Birden fazla blok aynı anda farklı prosesörlerde çalışabilir.
- 44:40CUDA'da Bloklar ve Senkronizasyon
- CUDA'da bloklar arasında senkronizasyon gerekli olabilir, özellikle milyonlarca işlem varken ve aynı verinin üzerine aynı anda yazma durumlarında.
- Bir bloğun içindeki thread'ler birbirleriyle farklı yöntemlerle haberleşebilir: ortak hafıza birimlerine erişerek, atomik operasyonlar kullanarak veya birbirlerini bekleyerek.
- Farklı bloklar arasındaki thread'lerin haberleşmesi için global memory kullanmak gerekir, bu yöntem pahalı ve latency yüksek bir yöntemdir.
- 47:31Grid ve Blok Yapıları
- Grid içindeki blokların koordinatları (block idx) belirtilir ve grid iki boyutlu olabilir (örneğin 2x2).
- Bloklar kendi içinde üç boyutlu yapıya sahip olabilir, bu yapılar tensor işleri, resim işleri veya vektör gibi farklı uygulamalara göre değişebilir.
- Threadler aslında lineer bir sıraya göre gruplanır, ancak grid'i organize ederken üç boyutlu, iki boyutlu veya bir boyutlu yapılar kullanmak kod yazma esnasında kolaylık sağlar.
- 51:50CUDA Performans ve Kısıtlamalar
- CUDA'da blok içindeki thread sayısı, bir streaming multi processor'ün aynı anda çalıştırabileceği blok sayısı ve paylaşımlı hafıza boyutu gibi kısıtlamalar vardır.
- Bir streaming multi processor'ün maksimum paylaşımlı hafıza kullanımı 48 KB'dır ve 65.536 register bulunur.
- Performansı en iyi hale getirmek için blok sayısı ve blok içindeki thread sayısı önemlidir, ancak her zaman 256 thread'li bloklar en iyi performansı sağlayabilir.
- 54:47CUDA Kodu Derleme
- CUDA kodları için nvcc adlı özel bir derleyici kullanılır, normal C kodlarını derlemek için kullanılan gcc yerine.
- CUDA kodları derlenirken "nvcc" komutu kullanılır, bu komut CUDA kodlarını derleyip çalıştırılabilir dosyaya dönüştürür.
- CUDA kodları için örnekler Atahan'ın kullandığı repository'de bulunabilir ve bu kodlar "git clone" komutuyla indirilebilir.
- 58:23CUDA Programı Çalıştırma
- Öğretmen, barbun qua'da CUDA programını çalıştırmak için rezervasyon oluşturuyor.
- Program çalıştırılırken GPU'ya bulaşmamak için 40 çekirdek kullanılması öneriliyor.
- Rezervasyonunun bitmiş olabileceği belirtiliyor ve yeni bir rezervasyon oluşturulması gerekiyor.
- 59:56CUDA Programı Yazma
- Öğrencilere bir egzersiz veriliyor: bir CUDA kernel yazıp çağırmaları isteniyor.
- Kernel, device üzerinde çalıştırılan boş bir fonksiyon olabilir.
- CUDA kodları için gcc yerine nvcc derleyici kullanılması gerekiyor çünkü CUDA kodları cc uzantılı dosyalarda bulunuyor.
- 1:01:37CUDA Derleme ve Çalıştırma
- nvcc, iki derleyici içeriyor: biri CUDA kernel'larını GPU için derliyor, diğeri ise geri kalan kodları GCC'ye geçiriyor.
- Program derlendikten sonra rezervasyon ile çalıştırılıyor.
- Program CPU tarafından çalıştırılıyor, GPU üzerinde bir işlem yapılmıyor.
- 1:05:12CUDA ve CPU İlişkisi
- CUDA kernel'ları non-blocking olduğu için, kernel çağrısından sonra hemen CPU işlemi devam ediyor.
- CUDA kernel'ı çalışırken CPU beklemiyor, bu yüzden "Hello GPU" çıktısı görünmüyor.
- CUDA device sync kullanıldığında, GPU işlemi bitene kadar CPU bekletiliyor ve "Hello GPU" çıktısı görülebiliyor.
- 1:08:39GPU Özellikleri ve CUDA Örnekleri
- NVIDIA SMI komutu ile GPU'nun özellikleri görüntülenebiliyor.
- Kullanılan makinede iki tane Tesla P100 GPU bulunuyor.
- CUDA kurulumunda örnek uygulamalar bulunuyor ve bunlar öğrenme için kullanılabilir.
- 1:10:57GPU Özellikleri ve Sınırlamalar
- Devasque komutu ile GPU özellikleri görüntüleniyor: iki GPU var, her birinin 16 GB hafızası bulunuyor.
- Her GPU'da 3584 çekirdek var, maksimum clock rate 1.33 GHz, memory clock rate 715 MHz.
- GPU'larda 48 KB paylaşımlı hafıza (shared memory) bulunuyor, bu kısıtlı bir kaynak olduğu için dikkatli kullanılması gerekiyor.
- 1:14:09GPU Hesaplama Özellikleri
- Bir blokta maksimum 128 thread bulunabilir, blok boyutları 128x128x64 olarak sınırlı.
- Grid'te tek boyutlu yapılar oluşturulabilir, maksimum thread sayısı 2048.
- GPU'larda iki copy engine bulunuyor, bu sayede işlem yaparken hafıza işlemleri CPU'yı yormadan arka planda gerçekleşebiliyor.
- 1:15:53GPU Kod Çalıştırma Örneği
- Kodda thread sayısı arttırıldığında, "Hello GPU" mesajı thread sayısı kadar tekrarlanıyor.
- Thread ID'leri hesaplanarak her thread'in benzersiz bir kimliği oluşturulabiliyor.
- Bloklar aynı anda çalışıyor ve makinenin üzerine dağılıyor, bu sayede paralel hesaplama sağlanıyor.