Ünite 6: Grafik İşlemci Birimi Tabanlı Programlama

Giriş

Geleneksel programlamada bir problemin çözümü tek bir işlemcinin üzerinde gerçekleştirilirken, paralel hesaplamada problem çeşitli alt bölümlere ayrılır ve her bir bölüm farklı işlemciler tarafından paralel bir şekilde çözülür.

Grafik işlemciler ilk olarak sadece grafik tabanlı işlemler için kullanılıyordu. Günümüzde biyoinformatik, hesaplamaya dayalı finans, sayısal analitik, moleküler dinamik, medikal görüntüleme, hava iklim tahmini gibi birçok uygulama alanında kullanılmaktadır.

Paralel Programlama

Geleneksel hesaplama ortamında bilgisayarlar tek çekirdekli bir işlemciye sahiptir. Bütün hesaplama işlemleri bu işlemci tarafından yürütülür. Bilgisayar programları birtakım komut serilerinden oluşmaktadır. Tek işlemci olması nedeniyle bilgisayar, aynı anda yalnızca bir tane komut çalıştırabilir. Dolayısıyla komut serileri, işlemci tarafından her defasında sırasıyla bir komut çalıştırılarak hesaplamalar yapılır.

Paralel programlamada ise büyük bir problem birden fazla parçaya bölünerek iki ya da daha fazla işlemci tarafından, her bir parçası eş zamanlı olarak çalıştırılır. Paralel programlamada hesaplama ortamında eşzamanlı olarak çalışan birden fazla komut işleyici vardır. Problem, eşzamanlı olarak çözülebilecek parçalara ayrılarak, her bir parça farklı işlemciler tarafından hesaplanır. Son olarak, bütün hesaplama birimlerinin sonuçları birleştirilerek genel sonuca ulaşılır.

Bir hesaplamanın paralel olarak yapılması problemine algoritma geliştirilmesi açısından bakılacak olursa en önemli olan konulardan biri, genel problemin nasıl alt parçalara ayrılacağı konusudur.

Paralel programlama çeşitli amaçlarla kullanılabilir. Ancak en belirgin amaç, bir problemin daha hızlı biçimde çözülmesini sağlamaktır. Herhangi bir hesaplama probleminin paralel şekilde çözülmesi hemen her zaman seri şekilde çözülmesinden çok daha hızlı tamamlanacaktır. Bu da önemli ölçüde zaman tasarrufu yapmayı sağlayacaktır. İkincil amaç, arka planda yatan motivasyon hala zaman kazanmak olsa da çok büyük problemlerin çözülebilmesine olanak sağlamasıdır. Dolayısıyla asıl motivasyon yine problemin çözümü için gerekecek zaman aralığını kısaltmak olsa da paralel programlama sayesinde, çözümüne ulaşılması mümkün görünmeyen problemler çözülebilir olurlar. Paralel programlamanın bir başka faydası ise sınırlı hesaplama kaynaklarının, birden fazla kişi tarafından ortak biçimde kullanılmasını sağlamaktır. Bu sayede sınırlı sayıdaki işlem birimi daha fazla kişi tarafından verimli biçimde kullanılabilir.

Merkezi işlemci birimleri (Central Processing Unit–CPU), aritmetik ve mantıksal operasyonları gerçekleştiren bir elektronik devreler bütünüdür. İşlemcilerin içindeki elektronik devreler, bir tür saat vuruşu mekanizması ile hareket ederler. Saat vuruşu, dijital bir elektrik sinyalinin 1’den 0’a inişi ya da 0’dan 1’e çıkışı ile tanımlanır. Bir saniye içerisinde bu saat vuruşlarından kaç tane olduğu, o işlemcinin frekansını belirler. Her saat vuruşu yeni bir komut çalıştırılması anlamına geldiğinden, bir işlemcinin frekansı ne kadar yüksekse, birim zamanda çalıştırabildiği komut sayısı da o kadar yüksektir denebilir.

Çok çekirdekli bilgisayarlar, tek çekirdekli olanlara göre çok daha hızlı çalışmaktadırlar. Daha önce bahsedildiği üzere çok çekirdekli işlemcilere sahip bilgisayarlarda paralel hesaplama teknikleri kullanılarak, iş yükü birden fazla işlemcinin üzerine paylaştırılabilir ve çözüm daha kısa sürede elde edilebilir.

Grafik İşlemci Birimi Tabanlı Programlamaya Giriş

Grafik işlemci birimi (Graphical Processing Unit–GPU), merkezi işlemci birimlerinden farklı olarak görüntü işleme komutlarını çalıştırmak üzere özelleşmiş bir elektronik devreler bütünüdür. Bu birimler, içlerinde bulunan hafıza birimlerini oldukça çok hızlı biçimde yönetirler ve bu şekilde görüntülerin oluşturulmasını sağlayan komutların yüksek performansta çalıştırılmalarını sağlarlar. Merkezi işlemci birimleri genel amaçlı komutların çalıştırılmasını sağlarken, grafik işlemci birimleri görüntü işleme komutları için optimize edildiğinden, görüntü arabirimlerine (monitör, mobil cihaz ekranı vb.) çıktı sağlarlar. Grafik işlemci birimleri kişisel bilgisayarlarda, cep telefonlarında, tabletlerde ve oyun konsolları gibi çeşitli sistemlerde kullanılmaktadır. Paralel işlem yapmak üzere özelleşmiş olan bu birimler görüntü işlemede ve bilgisayar grafiğinde etkilidir.

Paralel hesaplama açısından bakılacak olursa, NVIDIA’nın GeForce 3 serisiyle birlikte grafik işlemci birimi teknolojisinde önemli bir noktaya gelinmiştir. GeForce 3 serisi DirectX 8.0 standardını uygulayan ilk yonga olmuştur. OpenGL API ve DirectX ile birlikte GPU’lar kabiliyetlerini arttırmaya başlamışlardır. Artık her piksel, ek görüntü dokularını giriş olarak alabilen kısa program tarafından işlenebilir hâle gelmiştir.

2000’li yılların başlangıcında, grafik işlemci birimleri programlanabilir aritmetik birimleri kullanarak, her bir piksel için renk üretmek üzere yeniden tasarlanmıştır. Yeni nesil grafik işlemci birimleri her bir pikseli için çeşitli bilgiler kullanarak renk hesaplaması yapmaktadır. Bu bilgiler giriş renkleri, doku koordinatları gibi bilgiler olabilir. Giriş renkleri ve dokular üzerindeki aritmetik işlemlerin tümü programcının kontrolünde yapılmaktadır.

Renkten başka herhangi bir sayısal bilgi grafik işlemci birimine girdi olarak sağlanabilirse, bilgisayar programcıları bilgi üzerinde istedikleri hesaplamaları grafik işlemci birimine de yaptırabilirler. Böylece, GPU ile sadece piksellerin renk hesaplaması değil, farklı nümerik hesaplamaların yapılması da mümkün hâle gelmiştir. Böylece grafik işlemci birimlerinin yüksek aritmetik işlem gücünün hesaplama işlemlerinde başarılı olabileceği düşünülmüştür. GPU ile iletişimi sağlayan OpenGL ve DirectX kütüphanelerinin yapısının öğrenilmesi, GPU programlama yapabilmek için oldukça önemlidir.

CPU ve GPU ile programlama arasındaki farkları anlamak için yapılması gereken ilk şey, ikisinin işleyiş yapısını karşılaştırmaktır. CPU genellikle seri olarak işlem yapmak için tasarlanmış birkaç çekirdekten oluşmaktadır. GPU ise birden fazla görevi bir arada paralel olarak yapabilmek için tasarlanmış yüzlerce çekirdekten oluşmaktadır.

CPU programlama genellikle sınırlı sayıda kuyrukların çalışacağı uygulamalar için optimize edilmiştir. GPU ise farklı bir spektrumda programlamayı amaçlamaktadır. GPU’lar uzun hesaplama komutlarının hâkim olduğu çoklu kuyruklu uygulamalarda kullanılmaktadır. Günümüzde GPU’lar kuyruk işleme, veri önbelleği, sanal bellek yönetimi gibi konularda gelişmeye devam etmektedir.

GPU’lar genel olarak görüntü işleme operasyonlarını yürütmek için tasarlanmıştır. Görüntü işlemede aynı tür hesaplamalar birçok piksel için tekrar edilmektedir. Bu nedenle GPU’lar işlemler arasındaki geçişi hızlı bir şekilde yapabilmektedirler. GPU’larda aritmetik işlem yapan birimler, CPU’lara göre daha fazla sayıda bulunmaktadır. Bu nedenle çok fazla aritmetik işlem gerektiren operasyonları GPU’lar daha hızlı yapabilmektedir. Ayrıca, GPU’lar ile ondalıklı sayı işlemleri günümüzde CPU’lardan 20 kat kadar daha hızlı yapılabilmektedir.

CUDA ile GPU Programlama

CUDA (Compute Unified Device Architecture), GPU programlama için NVIDIA firmasının sunduğu C, C++, Fortran gibi programlama dilleriyle birlikte kullanılabilen mimari ve teknolojidir. CUDA, DirectX ya da OpenGL’e göre paralel kullanım erişilebilirliğini kolaylaştırmıştır. CUDA’nın genel amaçlı GPU programlamada sunduğu çeşitli avantajları vardır. Bunlardan ilki, hafızadan rastgele seçilen bir adresin CUDA kodu ile okunabilmesidir. Bir diğeri ise bit seviyesinde işlemler ile tam sayı ve ondalıklı sayı işlemler için tam destek sağlamasıdır.

CUDA’nın avantajları olduğu gibi bazı kısıtları da vardır. Bunlardan en önemlisi standart C kütüphanelerini tamamen desteklememesidir. Standart C’de derlenebilen bazı kodlar, CUDA C’de derlenememektedir. Ayrıca gerçekleme (rendering) dillerinden OpenGL ile çalışabilirliği tek yönlüdür. Yani, OpenGL kayıtlı CUDA hafızasına ulaşabilirken, CUDA OpenGL hafızasına erişememektedir. CPU ve GPU’nun birlikte kullanıldığı hesaplama ortamlarına heterojen hesaplama ortamı denilmektedir. Heterojen hesaplama terminolojisinde sunucu (host) ve cihaz (device) olmak üzere iki temel terim vardır. Sunucu, CPU ve sunucunun belleğinden oluşmaktadır. Cihaz ise GPU ve cihaz belleğinden oluşmaktadır. CUDA ile heterojen hesaplama şu şekilde gerçekleştirilmektedir. 1. Giriş verisi CPU’nun belleğinden GPU belleğine kopyalanır. 2. GPU programı yüklenir ve giriş verisine göre işlemler yapılır. 3. İşlem sonuçları GPU belleğinden CPU belleğine kopyalanır. C dilinde yazılmış bir kod, NVIDIA derleyicisinde “nvcc” komutu kullanılarak derlenebilir. Cihazda çalıştırılacak fonksiyonlarda __global__ anahtar kelimesi kullanılır. NUM_BLOCKS ve BLOCK_WIDTH parametreleri, fonksiyonun çalışacağı blok sayısını ve blok genişliğini belirtmektedir. BLOCK_WIDTH her bir blok için kuyruk sayısını ifade etmektedir.

CUDA ile GPU Uygulamaları

GPU’lar günümüzde biyoinformatik, hesaplamaya dayalı finans, sayısal analitik, moleküler dinamik, medikal görüntüleme, hava iklim tahmini gibi birçok uygulama alanına sahiptir.

Bazı firmalar üç boyutlu ultrason görüntüleme metodunu geliştirmeye başlamışlardır. Ancak bu görüntüler üzerinde hızlı ve başarımı yüksek bir şekilde hesaplama yapabilecek güce sahip bilgisayarlara ihtiyaç duyulmaktadır. GPU tabanlı CUDA mimarisini ve CUDA C programlama dilini kullanan cihazlar günümüzde bu alanda kullanılmaya başlanmıştır. Bu cihazlarla hızlı ve güvenilir şekilde göğüs kanseri teşhisleri konulmaya başlanmıştır.

GPU’lar grafikler üzerinde yüksek performanslı paralel işlem yapabildiği için videolar için de çeşitli kullanım alanları vardır. Bunlar video düzenleme, efekt ekleme, dijital animasyon, gerçekleme gibi işlemlerdir. Günümüzde Adobe gibi birçok firma animasyon ve simülasyonlar için çoklu GPU programlamayı kullanmaya başlamıştır.

GPU’lar simülasyon mühendisliğinde de kullanım alanlarına sahiptir. Simülasyon mühendisliğinde, bir ürünün tasarımından sonra üretime geçmeden önce ürünün simülasyonu yapılarak, ürünün geliştirme süresi kısaltılırken, kaliteyi arttırmak amaçlanmaktadır. Akışkanlar mekaniği ve sonlu eleman mekaniği gibi uygulama alanları için bilgisayar simülasyon yöntemleri geliştirilmektedir. Endüstride bunlar gibi birçok alanda GPU programlama sıklıkla kullanılmakta ve yüksek performans sağlamaktadır.