Rakipleri son ürünlerini piyasaya süreli iki yıl olmuştu. Önceki makalemizi okuduktan sonra bu makaleyi okumaya okumaya başladıysanız, tahminimce PS2'yi o zamanlarki gücüne kavuşturan 'o şeyi' görmeyi hâlâ bekliyorsunuz. Öyleyse, müsaadenizle, Sony'nin Emotion Engine'e sığdırdığı, çok önemli bir bileşen setini sizlere duyurayım: o güçlü Vector Processing Units veya 'VPU'.
Mimari
Vektör İşlem Birimi, vektörleri ve bilhassa dört kayan noktalı (float) sayıdan oluşan vektörleri işlemek için tasarlanmış küçük bağımsız bir işlemcidir. Bu işlemciler o kadar hızlıdırlar ki işlem başına tek döngü harcarlar, bu ise vektör işleme için aşırı elverişlidir. Buna karşın CPU'nun FPU'suyla aynı standart dışı (IEEE 754'e uymayan) davranışı sergilerler.
VPU'lar aşağıdaki bileşenlerden oluşur:
- Birkaç Vector Unit Memory ya da 'VU Hafızası': Vektör Birimi için çalışma alanı olarak kullanılır. Burada işlenmesi gereken değerler ya da önceki işlemlerin sonuçları depolanır.
- Bir Vector Unit: İşlemcinin çekirdeğidir. 'VU Hafızası'nda bulunan verilerin nasıl işlenmesi gerektiğini bildiren (Mikroprogram denen) bir yazılımı saklamak için biraz hafıza içerir (Mikro Hafıza/Micro Memory adı verilir).
- Bir 64-bit ISA uygular ve çalıştırma birimi ise iki paralel alt birime ayrılmıştır. Bunlardan biri, kayan noktalı sayılarla (float) çarpma ya da toplama, diğeri ise kayan noktalılarda bölme ya da tam sayılarda (integer) işlem yapar. Bu, kayan noktalı sayılar ve tam sayılarla eş zamanlı olarak işlem yapabilmeyi mümkün kılar.
- Bir Vektör Arayüzü: Ana hafızadan, Vektör Birimi'nin anlayabileceği bir formatta gelen vertex verilerinin (vertex data) otomatik olarak sıkıştırmasını açar (decompress eder). Ayrıca, bu birim mikroprogramları Micro Memory'e transfer edebilir.
İşlevsellik
Vektör biriminin çalışması için 'başlatılması' gerekir. Ana İşlemci, bu iş için olan mikrokodu sağlamaktan sorumludur.
Emotion Engine'in içine konmuş iki VPU vardır ancak bunlar farklı şekilde ayarlanmış olup, farklı kullanım ve optimizasyonlara elverişlidirler.
Vector Processing Unit 0
İlk VPU yani VPU0, CPU ile diğer vektör birimi (VPU1) arasında konumlandırılmıştır. Ana işlemciye 'yardımcı' rolde bulunur.
VPU0, iki adet işlem moduna sahiptir:
- Mikro Mod: Bu mod 'geleneksel mod'dur. VPU, Mikro Hafıza'da bulunan bir mikroprogramın 'mikro talimatlarını' bağımsızca yürütecektir.
- Makro Mod: VPU0, CPU için 'COP2'ye (Yardımcı İşlemci 2'ye) dönüşür ve belli bir 128-bit veriyolu aracılığıyla CPU'dan alınan 'makro talimatlar'ı çalıştırır.
- Makro talimatlar, micro talimatlarla aynı işlevselliğe sahiptir ancak farklı opcode'lar (assembly kodları) kullanır. Buna rağmen, VPU yürütme birimi artık ayrık değildir (yani aynı zamanda sadece 1 talimat yürütebilir).
- Bu mod VPU0'ın tüm bileşenlerinden tamamen yararlanamasa da CPU'nun vektör işlemlerini hızlandırmaya devam eder. Üstelik, basitlik açısından, bir yardımcı işlemciyi programlamak, bağımsız bir birimi programlamaktan daha kolaydır (bilgisayar programlayıcıları bunu kullanışlı bulacaktır).
VPU0'ın memory map'i, muhtemelen durumunu kontrol etmek veya diğer VPU tarafından yapılan bazı işlemlerin sonuçlarını hızlı bir şekilde okumak için diğer VPU'nun bazı register'larına ve flag'lere da erişebilir.
Vector Processing Unit 1
Mevcut ikinci VPU, yani VPU1 ise VPU0'ın dört katı mikro hafıza ve VU Hafızasıyla yükseltilmiş bir versiyonudur. Dahası, bu birim Elementary Function Unit ya da 'EFU' adı verilen; üstel ve trigonometrik fonksiyonların yürütülmesini hızlandıran ilâve bir bileşen içerir.
VPU1 konum olarak, VPU0 ve (GPU'ya çıkan kapı olan) Grafik Arayüzü'nün arasında bulunur, bu sebeple, ana veri yolunu kullanmadan ve olabildiğince hızlı şekilde GPU'yu geometriyle beslemek için ekstra veri yolları içerir.
Öte yandan VPU1, konumu gereği, sadece mikro modda çalışır.
VPU'nun trigonometrik işlemler için dizayn edildiği çok açık ve GPU için bir ön işlemci olarak hizmet edebilir. Genellikle bu sebepten, meşhur Görüntü Listeleri'ni teslim etmekle yükümlendirilir.
Sonsuz dünyalar
Bu birimlerden kullanışlı bir şekilde istifâde etme yöntemi de prosedürel oluşturmadır. Diğer bir ifadeyle, sahneyi, önceden kodlanmış geometri (yer ve nesne şekilleri) ile oluşturmak yerine, VPU'nun bunu algoritmalar kullanarak oluşturmasına izin vermektir. Bu durumda VPU, geometriyi matematiksel fonksiyonlar hesaplayarak oluşturur ve daha sonra bunlar GPU tarafından çevrilip (örn. üçgenler, çizgiler ve dörtgenlere), en nihayetinde sahneyi çizmek için kullanılır.
Kesin bir biçimde yazılmış verileri kullanmakla kıyaslandığında prosedürel içerik, paralelize edilmiş görevler için idealdir, çok az depolama gerektirir ve değişkendir (programlayıcılar parametrelerle oynayarak farklı sonuçlar elde edebilir) . Pek çok alan bu teknikten son derece yarar sağlayabilir:
- Karmaşık yüzeyler (örn. küre ve tekerlek).
- World rendering (örn. arazi, partiküller, ağaçlar).
- Bézier eğrileri, bilgisayar grafiklerinde eğri çizmek için kullanılan yaygın bir denklem. Bunlar bir Bézier yamasına (açık geometri) dönüştürülür ve gereken ayrıntı düzeyine bağlı olarak farklı hassasiyet derecelerini destekler.
Öte yandan prosedürel içerik, animasyonlarda sıkıntı oluşturabilir ve hattâ algoritma çok karmaşıksa VPU geometriyi (üç boyutlu şekli) gereken zamanda oluşturamayabilir.
Özetle, prosedürel işleme (procedural rendering) yeni bir teknik değil, ancak VPU'lar sayesinde daha fazla optimizasyon ve daha zengin grafik olanaklarına kapı aralıyor. Her şeye rağmen bu uygulaması kolay bir teknik değildir ve Sony Ar-Ge, konsollarında kullanılmak üzere farklı yaklaşımları izah eden bir çok belge yayınlamıştır.
Gidişâta sen karar vereceksin
Bu yeni eklemelerle, programlayıcılar artık kendi grafik motorlarını tasarlamak konusunda oldukça esnek davranabilirler. Buna yardımcı olmak adına Sony, verimli boru hattı (pipeline) tasarımları ortaya çıkarıp bunları belgelemek için ekstra kaynak harcadı. Aşağıdakiler, farklı iş yükü çeşitleri için optimize edilmiş grafik boru hattı örnekleridir :

Paralel boru hattı (pipeline) dizaynı.
Birinci örnekteki Paralel diazyn için; İşlemci, makro moddaki VPU0 ile takım hâlindedir ki VPU1 ile paralel olarak geometri işleyebilsin. CPU&VPU0 grubu, VPU1'in ana hafızadan veri aldığı yol olan ana veri yolunu kullanmaktan kaçınmak için, karalama belleğinden ve önbellekten tamamıyla istifade eder. Sonuç olarak, her iki görüntü işleme grubu da aynı anda kendi payına düşen Görüntü Listelerini GPU'ya gönderir.
İkinci örnekte görülen Seri dizayn ise, CPU&VPU0 grubunun VPU1 için bir ön işlemci olarak çalıştığı bir diğer yaklaşımı öne sürer. İlk aşama, geometrinin tümünü alıp işlerken, VP1 ise peşi sıra bunları Görüntü Listelerine dönüştürür.
Şu ana kadarkiler teorik açıdan örneklerdi ancak daha 'gerçeğe uygun' bir uygulanışı anlatması açısından, Jor Burton'un kendi yaptıkları PS2 oyunlarından birine ilişkin yayınladığı bir videoyu referans verebilirim .

Crash Bandicoot: The Wrath of Cortex (2001). Partiküller, mumun alevini ve pencere camından sızan ışığı meydana getiriyor.
Traveller's Tales'in eski yönetmeni, takımının nasıl tamamen VPU1'in içerisinde olan bir partikül sistemi oluştırmayı başardığını açıkladı. Kısaca anlatmak gerekirse, VPU1, önceden oluşturulmuş bir veri tabanını VU Hafızasından okumaya odaklandı. Bu veri tabanı, her an, başka bir bileşene ihtiyaç duymadan partiküllerin koordinatlarını hesaplamada kullanıldı. İşlemin sonucu doğrudan Görüntü Listelerine dönüştürülüp gönderilebildi.
Bu yaklaşımla, CPU büyük ölçüde yükten kurtuldu ve yapay zeka ve fizik işleme gibi diğer işlemleri halledebildi.
Başka bir çok örnek anlatılabilir ancak işin özü: Şu halde en uygun düzeni oluşturmak programlayıcıya bağlı ve bu da iyi bir şey.


