CUDA Nedir?
CUDA, Nvidia tarafından ortaya
konulan, bilgisayarın işlem performansına yüksek oranda katkı yapan bir paralel
programlama platformudur. C, C++, C#, Fortran, Java, Python gibi programlama
dilleri ile yazılmış algoritmaların GPU yani “grafik işlem birimi” üzerinde
çalışmasını sağlayan bir sistem olarak da tanımlanabilir.
Paralel programlama, birden fazla
CPU’nun bir arada çalışmasını istediği için zorluk çıkartır. CPU’lar aslen seri
işlemcilerdir ve birden fazla CPU’nun bir arada kullanılabilmesi için karmaşık
yazılımlar gerekmektedir. CUDA ise bünyesinde zaten paralellik yarattığı için
bu zorlukları ortadan kaldırıyor.
CUDA etkinleştirilmiş GPU ile görüntü ve video işlem,
hesaplamaya dayalı biyoloji ve kimya, akışkan dinamiği, bilgisayarlı tomografi,
sismik analiz, ışın izleme ve çok daha fazlası dahil olmak üzere geniş bir
aralıkta kullanım alanları bulmaktadır. CUDA, sadece NVIDIA GPU’larda çalışması
itibariyle rakiplerinden farklı olsa da 2012 yılı itibariyle dünya üzerinde 300
milyondan fazla CUDA destekli GPU olduğu bilinmektedir. Bugün bu sayı daha da
üst seviyeye ulaşmıştır.
GPU ve CPU Mimarisi Arasındaki Farklar
Normalde “işlem” denildiğinde akla
ilk gelen bileşen CPU’dur fakat iş paralel programlamaya geldiğinde GPU’lar
CUDA ile kendisini daha fazla öne çıkarıyor. Öncelikle bu iki yapı arasındaki
farkların üzerinden geçelim, daha sonra ise CUDA’nın nasıl çalıştığını daha iyi
anlamaya çalışalım.
Tasarım Amacı:
Bir CPU çekirdeği, tek bir yönerge
akışını bir kerede mümkün olduğu kadar çabuk yürütmek için tasarlanmıştır.
GPU’lar ise birçok paralel yönerge akışını mümkün olduğu kadar çabuk yürütmek
için tasarlanmışlardır.
Transistör Kullanımı:
CPU’larda transistörler
yönergelerin yeniden düzenlenmesini gerçekleştiren tamponlar, rezerve
istasyonları, tahmin mekanizmaları ve büyük tampon bellek gibi bileşenlerden
oluşur. Bu bileşenler, tek bir iş parçacığının yürütülmesini hızlandırmak için
tasarlanmıştır. GPU’da ise transistorler işlemci dizileri, çoklu işlem
donanımı, paylaşılan bellek ve birden fazla
bellek denetleyicilere atanmıştır. Bu özellikler belirli bir iş parçacığının
işletilmesinin hızlandırılmasına değil, yonganın üzerinde bulunan onbinlerce iş
parçacığının aynı anda yürütülmesi için tasarlanmıştır ve böylece iş parçacıkları
arasında iletişimi kolaylaştırarak yüksek bellek bant genişliği sağlar. Arabelleğin
(Cache) Rolü:
CPU, biriktirme ara belleğini, genel bellek erişim gecikmesini
azaltarak performans arttırmak amacıyla kullanır. GPU ise ara belleği (ya da
yazılımla yönetilen paylaşılan belleği) bant genişliğini arttırmak için
kullanır.
Gecikme (Latency) Yönetimi:
CPU’da bellek gecikmesi, geniş
arabellekler ve tahmin mekanizmaları ile yönetilir. Bunlar tasarım üzerinde
büyük yer kaplarlar ve genellikle güç tüketimi konusunda savrukturlar. GPU ise
gecikmeyi binlerce iş parçacığını bir anda destekleyerek yönetir. Eğer herhangi
bir iş parçacığı bellekten yük bekliyosa, GPU herhangi bir gecikmeye sebep
olmadan derhal başka bir işe geçiş yapar.
Çoklu işlem (Multi-threading):
CPU’lar çekirdek başına bir veya
iki iş parçacığı yürütme desteğine sahiptir. CUDA destekli GPU’lar ise akış
işlemcisi başına 1024’e kadar iş parçacığı destekler. CPU’nun uygulamalar
arasında bir kez geçiş yapması yüzlerce saat döngüsüne mal olurken GPU’nun
geçiş yaparken herhangi bir kaybı yoktur. Zaman kaybetmeden birçok geçişi ardı
ardına yapabilir.
SIMD ve SIMT:
CPU’lar vektörel işlemler için
SIMD (Single Instruction Multiple Data – Tek Yönergeyle Birden Çok Veri)
birimleri kullanırlar. GPU’lar ise ölçekli yürütme için
SIMT
(Single Instruction Multiple Thread – Tek Yönergeyle Birden Çok İş Parçacığı)
kullanırlar. SIMT, programcının verileri vektörler halinde düzenlemesini
gerektirmez, iş parçacıkları için rastgele dağılıma olanak tanır.
Bellek Denetleyici:
Örneğin Intel CPU’lar üzerinde
on-die bellek denetleyici bulunmaz. CUDA destekli GPU’lar, 8 adete kadar on-die
bellek denetleyici kullanırlar. Sonuç olarak GPU’lar, CPU’lara göre 10 kata
kadar daha fazla bant genişliğine sahiptirler.
CUDA Nasıl İşler?
Genellikle video işleme ve dönüştürme konusunda kullanılan CUDA’nın direkt olarak bu işe yönelmediğini en başından belirtmek gerek. Birbiri ile veri paylaşımı yapabilen paralel dizilime sahip çekirdekler, CPU’nun tek düzen şeklinde yapacağı işi yayarak gerçekleştirir. Farklı hatlara yüklenen işlemler yavaş gerçekleşir fakat tek yolda yapılabilecek süreden daha kısa sürede işlem sonuçlanır. Bunu daha iyi anlamak için aşağıdaki görseli inceleyebilirsiniz.
Yani kısacası konu kodlara ve CPU’nun tek başına kaldıramayacağı
ağırlıktaki yüklere CUDA göğüs gerer, işi paylaşır ve kısa süre içerisinde
bitmesini sağlar. Yalnız bu noktada bir şeyi de atlamamak gerek. CUDA’dan
faydalanmak için öncelikle bu özelliği açmak gerekiyor. Yukarıda daha önce
belirttiğimiz gibi kullanılan programlama diline yapılan ufak bir ek ile CUDA
aktif hale getirilebiliyor.
Hiç yorum yok:
Yorum Gönder