- GPU hesaplamaya dair temel bir anlayış, tüm yazılım mühendisleri için gereklidir
- Bu yazı ağırlıklı olarak Nvidia GPU'larına odaklanıyor ve Nvidia'nın terminolojisini kullanıyor
- GPU'lar; grafik, sayısal hesaplama, derin öğrenme ve benzeri alanlarda büyük ölçekli paralel işleme ile yüksek throughput için tasarlanmıştır
CPU ve GPU karşılaştırması
- CPU, komutları sıralı şekilde yürütmek için tasarlanmıştır ve komut yürütme gecikmesini azaltmaya yönelik çeşitli özellikler içerir.
- GPU, büyük ölçekli paralel işleme ve yüksek throughput için tasarlanmıştır; orta ila yüksek komut yürütme gecikmesine sahiptir.
- GPU, CPU'ya göre çok daha fazla sayıda işlemi çok daha hızlı işleyebilir.
# GPU mimarisi
GPU compute mimarisi
- GPU, streaming multiprocessor (SM) dizilerinden oluşur.
- Her SM, birden fazla streaming processor (çekirdek veya thread) içerir.
- SM, tüm çekirdeklerin paylaştığı sınırlı miktarda çip içi bellek (shared memory veya scratchpad) barındırır.
GPU bellek mimarisi
- GPU, çeşitli katmanlardan oluşan farklı bellek türlerine sahiptir.
- Her SM, çekirdekler arasında paylaşılan büyük miktarda register barındırır.
- Constant cache, kod yürütme sırasında kullanılan sabit verileri önbelleğe almak için kullanılır.
- Shared memory, hızlı ve düşük gecikmeli, çip içi programlanabilir SRAM bellektir.
- L1 cache, L2 cache'ten sık erişilen verileri önbelleğe alır.
- L2 cache, tüm SM'ler tarafından paylaşılır ve global memory'den sık erişilen verileri önbelleğe alır.
- Global memory, yüksek kapasiteli ve yüksek bant genişlikli DRAM'dir; SM'lerden uzakta bulunduğu için gecikmesi yüksektir.
# GPU yürütme modelini anlamak
CUDA kernel ve thread block'lara kısa giriş
- CUDA, Nvidia GPU'ları için program yazmaya yönelik bir programlama arayüzüdür.
- Kernel, GPU üzerinde paralel çalışan, C/C++ fonksiyonlarına benzer biçimde ifade edilen bir hesaplamadır.
- Bir kernel'i çalıştırmak için grid adı verilen bir thread kümesi başlatılır.
GPU'da kernel yürütmenin aşamaları
- Veriyi host'tan device'a kopyalama
- Thread block'ları SM'lere zamanlama
- Single instruction multiple threads (SIMT) ve warp
- Warp scheduling ve gecikmeyi tolere etme
- Sonuç verisini device'tan host belleğine kopyalama
# Kaynak bölüşümü ve occupancy kavramı
- GPU kaynak kullanım düzeyi, "occupancy" adlı metrikle ölçülür; bu, bir SM'in destekleyebildiği maksimum warp sayısına karşılık atanan warp sayısının oranını gösterir.
- Occupancy; SM'in yürütme kaynakları, register'lar, shared memory, thread block slot'ları ve thread slot'ları tarafından sınırlanır.
- Kod optimizasyonu yoluyla yüksek occupancy'yi korurken gecikmeyi en aza indirmek önemlidir.
# Özet
- GPU, birden çok SM'den oluşur ve her SM birden fazla işlem çekirdeğine sahiptir.
- Global memory, çipten uzaktadır ve gecikmesi yüksektir.
- L1 ve L2 cache, CPU'daki L1/L2 cache'e benzer şekilde çalışır.
- Her SM'de, çekirdekler arasında paylaşılan shared memory bulunur.
- GPU'da bir kernel çalıştırmak için bir thread grid'i başlatılır.
- GPU, SM'lerde çalıştırılacak block'ları atar ve bir block içindeki tüm thread'ler aynı SM üzerinde çalışır.
- Bir SM'e atanan thread'ler, warp adı verilen 32'lik gruplar hâlinde ayrıca gruplanır.
- GPU, thread gereksinimlerine ve SM sınırlarına göre thread'ler arasında dinamik kaynak bölüşümü yapar.
# Kapanış
- GPU'lar bugün yaygın biçimde kullanılmaktadır ve mimarileri ile yürütme modelleri CPU'lardan temelden farklıdır.
- Bu yazı, GPU'nun çeşitli yönlerini ele alarak neden yaygın kullanıldığını ve nasıl çalıştığını anlamaya yönelik içgörü sunar.
GN⁺ görüşü
- GPU'lar, derin öğrenme ve karmaşık sayısal hesaplamalar için vazgeçilmez bir teknolojidir; bu yazı, GPU'nun temel mimarisini ve yürütme modelini anlamaya yardımcı olur.
- Paralel işleme ve yüksek performanslı hesaplamaya ilgi duyan başlangıç seviyesindeki yazılım mühendisleri için özellikle önemli noktalar içerir.
- Bu yazı, GPU programlamaya dair temel bilgiler sunan ve bu alana yönelik merakı artıran ilgi çekici bir kaynaktır.
1 yorum
Hacker News görüşü