Şimdiye kadar, grafik boru hattının çeşitli aşamalarını uygulayan çok özel bir çevreden daha genel bir yaklaşıma doğru bir hareket olduğunu öğrendim. Bu dönüşüm kısmen 3D API'lere programlanabilir gölgelendiriciler şeklinde yansıtılmıştır. Çoğu transistör, gerçek gölgelendirici talimatlarını uygulayan büyük ölçüde paralel SIMD birimlerine adanmış görünmektedir.
Doğru. Temel olarak, eski GPU'lardaki nispeten büyük özellik boyutu nedeniyle, temel aydınlatma, kenar yumuşatma, doku eşleme, geometri vb. Performans uğruna esnekliği feda ettiler, çünkü mevcut GPU'lar gibi daha genel, büyük ölçüde paralel bir SIMD mimarisi kullanarak onu uygulayabilecek yeterli çip yoğunluğuna sahip değillerdi.
Modern bir GPU (düşünün Nvidia Fermi) temelde CPU ve çeşitli önbellekten talimatlar ve verilerle beslenen bir dizi "aptal" SIMD dizisidir ve grafik boru hattını bu talimatlarla eşleştiren tüm gerçek mantık grafik sürücüsünde gerçekleşir ?
Bazı şeyler hala donanımda yapılır; diğerleri değil. Örneğin, piksel verilerini VGA yonga setine itmek için son aşamada ROP'lar hala kullanılmaktadır. Not Burada gerçekten "VGA" olup olmadığına bakılmaksızın, video sinyalini monitörünüze ileten mekanizmaya atıfta bulunmak için genel bir terim olarak "VGA yongaseti" kullanıyorum.
Genel olarak, Nvidia Fermi ve AMD Güney Adaları gibi mevcut GPU mimarilerinin çoğunlukla özel bir talimat setine sahip oldukları büyük ölçüde paralel CPU'lar olduğu ve her bir "çekirdek" in son derece zayıf olduğu doğrudur, ancak bir bütün çekirdek sürü (bazen birkaç bin). Ancak hala grafiklere özgü donanım var:
Donanım video kod çözme genellikle sabit işlev yongaları kullanılarak yapılır. Bu, özellikle DRM (Dijital Sınırlamalar Yönetimi) söz konusu olduğunda geçerlidir. Bazen "donanım" video kod çözme, SIMD çekirdeği için normalde eski görevler olarak sunulan bellenim eşliğinde bir dizi talimat anlamına gelir. Gerçekten bağlıdır.
Çok az bilgi işlem özel Nvidia kartı (Tesla) hariç, hemen hemen tüm "genel SIMD" grafik kartlarında video çıkışına ayrılmış eksiksiz bir donanım dizisi bulunur. Video çıkışı oluşturma ile aynı değildir; sabit işlev çıkış öğeleri arasında LVDS / TMDS / HDMI / DisplayPort codec bileşenleri, HDCP ve hatta ses işleme (temelde küçük bir DSP) bulunur, çünkü HDMI sesi destekler.
"Grafik belleği" hala GPU'larla birlikte depolandığından, kendisinin daha yavaş ve yanıt vermenin daha pahalı olduğundan daha uzun süren sistem RAM'ini vurmak için konuşkan ve nispeten yüksek gecikmeli PCIe veriyolunu geçmeleri gerekmiyor, daha düşük kapasitelerde ancak sistem belleğinden daha yüksek hızlarda daha yüksek kalite, daha hızlı grafik belleği (örn. GDDR5). Grafik belleğinde bir şeyler saklama ve oradan GPU'ya veya CPU'ya alma işlemi hala sabit bir işlev işlemidir. Bazı GPU'ların kendi "IOMMU" türleri vardır, ancak bu bellek yönetim birimi CPU'dan farklıdır (ayrı). Ancak bu, bellek mimarisinin neredeyse tamamen "tutarlı" olduğu işlemcilerine (Sandy ve Ivy Bridge) entegre yeni Intel GPU'lar için geçerli değil. sistem belleği) ve grafik belleğindeki okumalar GPU için olduğu kadar CPU için de ucuzdur.
Veya GPU'da, gelen yüksek düzeyli talimat ve veri akışlarını (derlenmiş gölgelendirici programları, tepe noktası verileri ve nitelikleri ve dokular) gerçek SIMD talimatlarına dönüştüren ve senkronizasyon, bellek ayırma vb.
SIMD'lerin "yerel" dili, GPU'nun kendi ürün yazılımı tarafından değil, hemen hemen her zaman yazılımdaki sürücü tarafından oluşturulur. Bu özellikle DirectX 9 / OpenGL 2.x seviyesi özellikleri için geçerlidir. HLSL, GLSL veya OpenGL ARB gölgelendirici toplayıcısı gibi üst düzey dillerde yazılmış gölgelendiriciler, sonunda, hesaplama ve / veya işlemin toplu arabelleklerini göndermek için belirli kayıtlara vurarak ve gerekli PCIe kasnaklarını yaparak GPU talimatlarına dönüştürülür. komutlar.
Donanım mozaikleme (DirectX 11 / OpenGL 4.0) gibi birkaç şey, eski günlerde neredeyse her şeyi nasıl yaptıkları gibi, donanıma sabit işlevli bir şekilde tekrar itilir. Bunun nedeni, performans kısıtlamalarının yine de bu hesaplamaları yapmanın en etkili yolunun, ürün yazılımına veya sürücünün SIMD'leri yapmak için "programına" sahip olmak yerine, bunun için özel bir devre olmasını gerektirmesidir.
Gerçekliğin bu iki uç arasında bir yerde olduğundan şüpheleniyorum ve cevap oldukça uzun ve çok fazla spekülasyona dayanıyor (bazı GPU sağlayıcılarının ürünleri hakkında herhangi bir belge yayınlamayı reddetmek için bir neden olmalı, sürücü kaynak kodu ...), ancak doğru yönde ve faydalı kaynaklardaki ipuçları büyük beğeni toplar.
AMD ve Intel, Linux için tamamen çalışan açık kaynaklı grafik sürücülerinin yanı sıra, son GPU'ları hakkında açık bir şekilde çok sağlam belgelere sahiptir (Mesa ve Direct Rendering Manager projelerine bakın). Bu sürücülerdeki kodlardan bazılarına bakarsanız, güleceksiniz, çünkü grafik sürücüsü yazarları aslında "yazılım" içinde çeşitli şekiller veya desenler çizme gibi şeylerin geometrisini uygulamak zorundalar (ancak gerçekleri göndermek için donanım komutlarını kullanmak zorundalar.) işleme için donanıma), çünkü GPU ürün yazılımı veya sabit işlev şeyler artık donanımda tam olarak işlemek için mevcut değildir :) Yeni OpenGL 1.x / 2.x'i desteklemek için ne yapmaları gerektiği komik donanım.
Evrim böyle gitti:
- Çok uzun zaman önce (gerçek zamanlı 3B oluşturmanın mümkün olduğu düşünülmeden önce): CPU üzerinde ışın izleme gerçek zamanlı olmayan oluşturma için normaldi. Windows'un ilk sürümlerinde gördüğünüz gibi basit grafikler için, CPU sabit işlev donanımı olmadan basit şekiller (dikdörtgenler, bir yazı tipinin karakterleri, gölgeleme desenleri, vb.) Çizecek kadar hızlıydı, ancak çok karmaşık şeyler çizemedi.
- Uzun zaman önce (OpenGL 1.x): katı hal donanımı tarafından uygulanan hemen hemen her şey; "elektriksel" sabit fonksiyonlar temel operasyonlar için bile normdu
- Bir süre önce (OpenGL 2.x): GPU'ları daha programlanabilir hale getirmek için bir geçiş başladı. 5 yıllık donanımdaki "Fragman gölgelendiricileri" (piksel gölgelendiricileri) neredeyse bir CPU gibi rasgele hesaplamalar yapabilir , ancak hala grafiklere yönelik olan mimari ile sınırlıdır. Bu nedenle, OpenCL / DirectCompute bu donanımda kullanılamaz.
- Son zamanlarda (OpenGL 3.x): Genel amaçlı GPU'lara geçiş çoğunlukla tamamlandı, ancak elbette, verimli bir şekilde çalışabilen CPU'lar yerine toplu olarak gönderilen büyük veri matrislerini (lineer cebiri düşünün) içeren iş yüklerine göre optimize edildi. çok küçük verilerin uzun sekansları (sırayla 1 + 1, 2 * 4, 5 * 6 vb.) Genel amaçlı hesaplama OpenCL, CUDA, vb. aracılığıyla yapılabilir, ancak donanım hala tam açık bir "SIMD yardımcı işlemci" değildir. çünkü (a) hala GPU işlevine erişmek için donanıma özgü kayıtları tutmanız gerekir; (b) PCIe veri yolu yükü nedeniyle GPU VRAM'dan okuma çok yavaştır (mevcut mimaride GPU'dan okuma çok optimize edilmemiştir); (c) bellek ve önbellek mimarisi CPU ile uyumlu değildir; birçok eski sabit işlevli donanım hala etrafta duruyor.
- Present (OpenGL 4.x): Eski sabit işlevli donanımların çoğundan kurtuldum. GPU okuma gecikmesini bir miktar geliştirdi. IOMMU'lar , VRAM ile sistem belleği arasında (çevrilmiş) donanım destekli bir haritalamaya izin verir. Ayrıca, sabit işlev öğelerini geri getiren donanım mozaikleme de tanıtıldı.
- Gelecek ( HSA): GPU temel olarak bir yardımcı işlemcidir. PCIe veriyolundaki özel GPU'lar için bile GPU ve CPU arasında çok az empedanslı (okuma / yazma için) CPU ile tamamen entegre edilmiştir. Tamamen tutarlı bellek mimarisi - "mi memoria es su memoria" (benim hafızam senin hafızan). Kullanıcı alanı programları, sürücü şim olmadan sistem belleğinden okudukları gibi "VRAM" 'dan okuyabilir ve donanım bununla ilgilenir. Mütevazı miktarda veri için "seri" işleme için CPU'ya (bunu yapın, sonra yapın, sonra yapın, sonra yapın) ve "paralel" işleme için GPU'ya (bu işlemi büyük veri kümesinde gerçekleştirin ve bölün) nasıl uygun gördüğünüze kadar). GPU'nun bulunduğu kartta hala ROP'lar, HDMI codec bileşenleri vb. Olabilir, ancak bu şeyler ekran çıkışı için gereklidir,