Grafik İşlem Birimlerinde(GPU) büyük adım: Nvidia Fermi
NVidia’nın G80(GeForce 8800) serisinden bu yana geliştirdiği CUDA mimarisi G200 serisi ile çok daha etkin bir hal almıştı fakat 2009′un sonunda yani önümüzdeki aylarda piyasaya çıkması beklenen G300 serisinin mimariye getireceği yeniliklerin G200′ün çok üzerinde olduğunu söylemek mümkün. Açıkcası Fermi kod adı ile anılan G300 serisinin Grafik İşlem Birimleri(GİB)lerin programlanmasında büyük kolaylık ve esneklik getireceğini söylenebilir. Fermi’nin yeniliklerinden en önemli gördüklerimi bir kaç madde ile öncelikle özetleyelim sonra da detaylara geçelim;
- 64 bitlik kayan noktalı sayılarda başarım arttırımı
- Önbellek hiyerarşisi ve daha fazla paylaşımlı bellek
- Hızlı bağlam değiştirme ve eşzamanlı kerneller
- Dual Warp zamanlayıcısı
- Daha hızlı atomic işlemler
- Nvidia Nexus – Nvidia’nın bütünleşik geliştirme ortamı
- Azalan yazmaç(register) sayısı?
Öncelikle G300 serisi ile NVidia’nın 55nm’den 40nm’lik üretim tekniklerine geçtiğini belirtmek gerek. İşlemcilerde (i7) bu boyut 32nm’lere inmişken gerçekten aşılması gereken ve önemli bir kısıttı. Bu bizim için aynı alana daha çok transistör demek olduğu için daha çok çekirdek ve daha çok işletim gücü anlamına geliyor. Bu da ilk adımda kendisini gösteriyor, G80′de 681 milyon olan transistör sayısı, G200′lerde 1.4 milyara ve G300 serisi ile 3 milyara erişmiş durumda. Transistör sayısındaki bu artış elbette ilk aşamada çekirdek sayısını etkiliyor ve G200′e göre Fermi’nin neredeyse iki katı kadar çekirdeği mevcut.
64 bitlik kayan noktalı sayılarda başarım arttırımı
G80′de double türü veriler ile çalışmak mümkün değilken, G200′lerde IEEE’nin 1985 standartına destek verilmeye başlanmıştı. Fermi ile ise hem 32 bit hem de 64 bit’te GİB’ler 2008 standartı ile uyumlu olacak. Bunun en büyük getirilerinden birisi 32 bit için fused multiply-add(FMA). Çarpım ardından toplama pek çok bilimsel uygulamada, doğrusal cebirde karşılaşılan bir durum. Önceki mimaride multiply-add(MAD) olarak tek adımda gerçekleştirilen bu işlem, çarpımdaki fazladan oluşan basamakları saklamıyordu ve bu basamaklar toplama işleminde kaybediliyordu. FMA ile ise bu basamakları korumak mümkün. Aynı zamanda G200′lerde 24 bitlik hassaslığa sahip tamsayı aritmetik işlem biriminin de artık 32 bit kapasitesinde ve aynı performansta olmasa da 64 bit’e de desteği mevcut
AİB ile GİB arasındaki hesaplamalarda tutarlılığı arttıracak bu işlemler haricinde başarım(performans) konusunda da yapılmış bazı geliştirmeler var. Bunlardan en önemlisi NVidia’nın artık double’lara daha fazla destek vermesi. G200 mimarisinde Special Function Unit(SFU)’ler aracılığıyla gerçekleştirilen double işlemler, SFU sayısı ile kısıtlanmış durumdaydı. Bu sebeple 32 bit ile 64 bit arasında en iyi koşullarda bile 8 katlık bir performans farkı mevcuttu. Bu durum 64 bitlik hassasiyetle ancak gerçekleştirilebilen iteratif işlemlerin önünde büyük bir engeldi. Fermi mimarisinde SFU’ların sayısının arttırılması ile saat vuruşunda gerçekleştirilen double işlemlerinde 8 kat’ın üzerinde bir artış sağlanmış ve float’lar ile aradaki fark 8 kat’tan sadece 2 kat’a inmiş durumda.
Önbellek hiyerarşisi ve daha fazla paylaşımlı bellek
Önceki mimarilerin sahip olmadığı önbellek hiyerarşisi, paylaşımlı bellekle çözülemeyen sorunların hızlandırılmasında büyük bir avantaj sağlıyor. Özellikle GİB’in RAM’i ile çekirdekler arasına yerleştirilen önbellek mevcut koşullarda SM başına 768KB’lık boyutuyla mükemmel bir imkan gibi gözüküyor. Paylaşımlı bellekle çözüme ulaşılmaya çalışılan sorunlarda bile büyük bir avantaj sağlayacağını görmemek imkansız.
Bunun haricinde çekirdeğe yakın konumlandırılmış bir bellek gibi tanımlanmış paylaşımlı bellekler ile L1 önbelleği bütünleştirilmiş ve toplam boyut 16KB’tan 64KB’a çıkarılmış. Bunu da iki farklı şekilde kullanmak mümkün. Bir koşulda önceki mimarilerde olduğu gibi 16KB paylaşımlı bellek ile 48KB’lık ekstradan bir L1 önbelleğe sahip olmak mümkün. Bu durum bellek erişimleri önceden tahmin edilemeyen sorunlar için çözüm olabilir. Diğer ayarda ise durumun zıttı yani 48KB’lık paylaşımlı bellek ile 16KB’lık önbellek kullanılabiliyor. Bu durumda yerelde daha fazla yere ihtiyaç duyan sorunları kolaylaştıracak gibi gözüküyor.
Hızlı bağlam değiştirme ve eşzamanlı kerneller
Kernel’ler GİB üzerinde çalışacak işleri tanımlamak için kullanılmaktadır. Ve Fermi’ye kadar GİB üzerinde sadece bir adet kernel çalıştırılabilmekteydi. Yani bir GİB üzerinde birden fazla kernel çalıştırmak mümkün değildi. Fermi ile kaynaklar imkan verdiği sürece 16 adete kadar kernel’i eşzamanlı çalıştırabilmek mümkün. Kernel’ler arası iletişime imkan sağlayan bu durumda bağlam değiştirme süresinin de 25 mikrosaniyeye(25 x 10–6 sn) indirilmiş olması da performans açısından gerçekleştirilebilirliği destekliyor.
Tabi ki bu durum her koşulda göründüğü kadar işe yaramayacaktır. Örneğin şimdiye kadar gerçekleştirdiğim hiçbir kernel’in GİB üzerindeki çalışabilecek thread sayısından az thread’i yoktu. Fakat kernel’in bitmesine yakın GİB’in boşalmaya başladığı düşünülürse orada küçük bir başarım arttırımı sağlayabilir. Ama bu durum tek kernel kısıtından kaynaklanan bir durumdu ve yeni mimariye göre yeni algoritmalar geliştirilebilir. Örneğin kernel boyutları küçültülüp büyük bir veri için parçalanarak çözüme ulaşmak için çok sayıda kernel ardıl olarak başlatılabilir(aslen bazı sorunlar için böyle çözümler uygulanmakta). Böylece birden çok küçük kernel GİB üzerinde eşzamanlı çalışabilir. Tam anlamı ile üzerinde pek çok deneme yapılabilecek ve faydalı bir özellik olduğunu söylemek gerek.
Dual Warp zamanlayıcısı
CUDA mimarisinde thread’ler 32 thread’den oluşan warp’lar halinde çalıştırılmaktadır. Fermi öncesinde SM başına bir warp çalıştırılabilmekteyken warp zamanlayıcı ve komut dağıtıcısı ikiye katlanarak warp’lar Fermi ile ikişer ikişer çalıştırılabilmektedir. Bu geliştirmeyi, SM başına düşen 8 çekirdek sayısının 32′ye çıkmasının sonucu olarak yorumlamak mümkün. Yeni donanım tasarımı tam olarak kullanabilmek için gerekli bir adım ve mevcut çoğu komut koşut çağrılmaya elverişli. Tek olumsuz yanı henüz 64 bit’lik işlemleri desteklememesi.
Daha hızlı atomic işlemler
Aslen diğer iyileştirmeler yanında basit bir şey gibi gözükse de atomic işlemler(yarış durumlarını ortadan kaldırmaya yarayan ve sadece bir thread’in verinin üzerinde çalışmasına imkan sağlayan işlemler) GİB’de programlama yaparken kaçınılması gereken tercihlerden biriydi. Özellikle ana bellekte olan değişkenler gerçek anlamda yavaşlamalara sebep olmaktaydı. Fermi mimarisi ile atomic işlemlerin 20 kat hızlanacağını belirtmiş Nvidia, umarız böyle bir hızlanma gözlemlenebilir.
Nvidia Nexus – Nvidia’nın bütünleşik geliştirme ortamı
Nexus bütünleşik geliştirme ortamı, Windows ortamında Visual Studio ile tam bir bütünleşme sağlıyor. Artık VS üzerinden hata ayıklama ve istenilen thread’e odaklanmak, VS’de kullanılan her türlü imkanı kullanmak mümkün.
Açıkcası bu habere sevinsem mi üzülsem mi demekteyim. Çünkü benim gibi problem sebebiyle Linux ortamında çalışmaya mecbur insanlara atılmış büyük bir gol bu. VS ile bütünleşik bir çözüm geliştirmektense Nvidia’nın kendi ortamını tasarlamasını tercih ederdim. Fakat mevcut duruma bakıldığında Windows 7′ye Nvidia’nın verdiği desteği ve ilişkinin tersi de görülünce bu iş ilişkisinin kırılması mümkün gözükmüyor. Linux ortamında gcc derleyicilerine destek veren Nvidia’nın, Windows ortamında halen gcc’ye destek vermeyip sadece Microsoft derleyicilerine zorlaması büyük bir ayıp. Bunun tasarımdan kaynaklanan bir kısıttansa bir iş ilişkisi sonucu tercih olduğunu söylemek hata olmaz. Aynı zamanda ücretsiz olarak sundukları CUDA SDK’nın Windows’ta sadece VS ile geliştirilebildiği düşünülürse, Windows ortamında CUDA geliştirmenin ücretsiz olduğunu söylemek imkansız.
En kısa zamanda Nvidia Windows ortamında gcc’ye destek sağlamalı ve Linux ortamında da bütünleşik geliştirme ortamı gerçekleştirilmeli.
Azalan yazmaç(register) sayısı?
G200 serisinde SM başına 16384 adet 32 bit yazmaç düşerken Fermi ile bu sayı 4′te 1′ine yani 4096′ya düşecek. Nvidia bu duruma çok fazla değinmese de, önceden önbellek olmadan kodların performansı çok fazla etkileyen bu yazmaç sayısı, GİB üzerinde tam doluluğu yakalamak için önemli etkenlerden biri idi. Fermi ile bu açık, L1 önbelleği ile doldurulacağa benziyor. Artık biz de doluluk hesaplarken yazmaç sayısından biraz daha bağımsız olabileceğiz gibi gözüküyor. Gene de bu mimari tercihin sebepleri açıklanabilirdi diye düşünüyorum.
Özetle
Fermi mimarisinin GİB’ler için büyük bir adım olduğunu söylemek mümkün. Nvidia bu mimari ile de ekran kartlarını koşut programlamaya uygun hale getiren adımlar atmaya devam ediyor. Nvidia’nın CUDA’yı çıkarmasının ardından, Fermi’nin bu konuda en büyük adımlarından biri olduğunu söylemek mümkün. Göründüğü üzere GİB’ler daha fazla hayatımızın içinde ve yazılımlar tarafından kullanılan ana parçalardan biri olmaya doğru daha emin adımlar atıyor. Gerçekten GİB’ler yardımcı işlemciler konuma gelecek mi, henüz kesin değil. Ama bu yöndeki atılımların gittikçe ciddileşmesi önemli ve değerlendirilmesi gereken bir durum.
















