- Moore Yasası sınırlarına dayanırken, donanım tek çekirdeği hızlandırmaktan çok çekirdekli, paralel işleme odaklı bir yapıya evrildi
- Paralel işleme, veri paralelliği, model paralelliği, boru hattı paralelliği gibi çeşitli biçimlere ayrılır ve modern derin öğrenme sistemlerinde karma şekilde kullanılır
- SIMD (komut düzeyinde veri paralelliği), iş parçacığı/çekirdek paralelliği, GPU kitlesel paralelliği gibi farklı katmanlarda paralelleştirme gerçekleştirilir
- Paralel işleme için diller, kütüphaneler ve araçlar çoğunlukla mevcut sıralı dillere sonradan eklenmiş uzantılar olduğundan, paralelliğin dile yerel olarak entegre edilmesi yönündeki akımın (Mojo vb.) öne çıktığı görülüyor
- Önbellek satırı paylaşımı (gereksiz etkileşim) optimizasyonu, verimli bellek bölümlendirme, otomatik vektörleştirme gibi pratik performans iyileştirmeleri önemli zorluklar olarak öne çıkıyor
Paralelliğin motivasyonu ve donanımın evrimi
- İlk dönemde transistör küçülmesi ve saat hızlarının artmasıyla performans doğal olarak yükseliyordu; ancak ısınma/üretim süreci sınırları nedeniyle fiziksel sınırlara ulaşıldı
- Sonrasında çok çekirdekli mimari standart hâline geldi ve tek bir CPU'ya onlarca ila yüzlerce çekirdek yerleştirildi
Paralelliğin genel biçimleri
- Veri paralelliği: Aynı işlemi çok sayıdaki veriye eşzamanlı uygulama (ör. vektör toplama işlemi)
- Model paralelliği: Tek bir modeli birden çok cihaza dağıtarak yerleştirme
- Boru hattı paralelliği: Hesaplamayı birden çok aşamaya bölme; her aşama aynı anda çalışır
SIMD (tek komut çoklu veri) ve vektörleştirme
- SIMD, tek bir komutla birden fazla veriyi (vektörü) işleme yöntemidir; ARM NEON, x86 SSE/AVX gibi çeşitli ISA'larda desteklenir
- C/C++ intrinsic'leri ile vektör işlemleri açıkça kontrol edilebilir; derleyicinin otomatik vektörleştirmesi de desteklenir ancak sınırları vardır
- Pratikte, vektör uzunluğu kadar yinelemeli işlem yapıldıktan sonra kalan veri skaler işlemlerle tamamlanır
CPU üzerinde paralelleştirme
- İş parçacıkları kullanılarak çok çekirdekte paralel yürütme yapılır; dil bazlı API'ler ve OS zamanlayıcısı tarafından desteklenir
- İş parçacığı oluşturma/yok etme maliyeti yüksek olduğundan, verinin boyutuna göre uygun sayıda (çekirdek sayısına yakın) iş parçacığıyla işi bölmek daha verimlidir
- Önbellek satırı 'false sharing' (farklı iş parçacıklarının aynı önbellek satırı içindeki bağımsız değişkenlere erişmesiyle performans düşüşü) optimizasyonu önemlidir; C++17'deki
std::hardware_destructive_interference_size gibi araçlar kullanılabilir
- Her iş parçacığının ayrı veri alanına yazmasını sağlamak için padding/hizalama işlemleri gerekir
GPU üzerinde paralelleştirme
- GPU'lar, binlerce küçük çekirdek aracılığıyla büyük ölçekli veri paralel işlemede uzmanlaşmıştır
- CUDA/OpenCL: kernel fonksiyonları onlarca ila on binlerce iş parçacığı/blok düzeyinde çalıştırılır; içeride ise SIMT (tek komut çoklu iş parçacığı) modeli kullanılır
- Çalışma grubu/warp düzeyinde çalışılır; dallanma (branch divergence) miktarını azaltmak performans için kritik önemdedir
- Bellek hiyerarşisi: iş parçacığı register'ları, blok paylaşımlı bellek, tüm cihazın global belleği gibi katmanlarda hiyerarşik optimizasyon gerekir
Triton: Python tabanlı GPU kernel DSL'i
- Triton, Python içine gömülü bir DSL'dir; JIT derleme ve çoklu backend (MLIR/LLVM/PTX vb.) desteği sunar
- Kernel kodu yüksek seviyeli Python ile yazılır; otomatik paralelleştirme, bölme ve maskeleme gibi özellikleri destekler
- NVIDIA cuDNN düzeyine kıyasla %75–90 performans sunarken, geliştirme karmaşıklığını büyük ölçüde azaltır
Paralelliğin dile yerel olarak kazandırılması: Mojo
- Mojo, LLVM/MLIR geliştiricisi Chris Lattner tarafından oluşturulan yeni bir dildir; paralellik ve donanıma özgü derlemeyi dil seviyesinde destekler
- SIMD vektör tipleri, vektörleştirme fonksiyonları, host/device bellek ayrımı gibi unsurlarla tip sistemi ve dil yapısına paralellik gömülüdür
- Python tarzı döngüler de otomatik vektörleştirilebilir; açık düşük seviye kontrol olmadan da performans elde edilebilir
Sonuç ve görünüm
- Modern paralel programlama, farklı donanımlar ile paralellik modellerinin birleşiminden oluşur ve dilin kendi desteği giderek daha önemli hâle gelir
- Mojo, Triton, JAX gibi yeni nesil paralel diller ve araçların yükselişiyle paralelleştirme daha sezgisel ve üretken bir yöne evriliyor
- Paralel programlamada gerçek performansı en üst düzeye çıkarmak için donanım mimarisi, bellek optimizasyonu ve dil desteğinin organik biçimde birleşmesi gerekir
Henüz yorum yok.