13 Kasım 2017 Pazartesi

CUDA Nedir?


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