Aygıt sürücüsü talimatları GPU'yu nasıl programlar?


9

Diyelim ki bir bilgisayar kullanıyorum, tipik bir modern bilgisayar az çok. Bir aygıt sürücüsü, ekranımda gördüğüm her şeyden sorumludur, bunu yazdığım gibi ekran da güncellenir (bu, elbette, Windows gibi bir işletim sistemi kapsamındadır).

Bunu, bir çekirdek olup olmadığını donanımın umursamadığı seviyeye indirelim ve sadece talimatlar alalım.

Temel olarak, GPU'lar her şeyi nasıl yapılacağını nasıl biliyor? Bir sürücü temel olarak bir sürücünün sağladığı özel talimatları kullanarak ikili verileri görüntülemek için mümkün veya gerekli olan her küçük, içsel veya donanım devre düzeyi işlevini kontrol ediyor mu?

Öyleyse, GPU bir CPU'nun yaptığı gibi gönderilen talimatları anlamak için "özel" bir dil veya "birleştirme" kullanıyor mu?

Bilgilerimde çok fazla boşluk var ve GPU'ların arkasında ve onlara doğrudan donanım aracılığıyla erişmekte hoş olmayan bir "gizem" var.

Örneğin, bir GPU ve CPU bir şekilde bağlanabilmelidir, bu nedenle bir GPU'ya CPU montajı ile ve doğru veri / adres veriyollarını uygulayarak erişmek mümkündür. Bir aygıt satıcısının GPU'yu bir sürücü dışında erişmesini imkansız kılamaz, çünkü sürücü de derlenmiş bir koddur ve programlanabilir bir devre olarak GPU'nun ikili talimatlarla çalışması gerekir.

Bu tür soruları sordum ve birçok sitede neden cevap vermeden şiddetle hızlı bir şekilde siliniyorlar, bu yüzden burada büyük gizem / sır nedir? Bir anakartta diğer herhangi bir erişim gibi erişilen bir donanım.

Yani gerçekten ... bunun yazılım ve donanım ile ilgili "tamam" bir soru olduğu varsayılarak, herkes satıcıya özgü dosyalar olmadan bir GPU'ya doğrudan erişebilir, çünkü dosyalar büyülü değildir.

Peki GPU'lar donanıma özgü doğrudan donanım perspektifinden donanıma özgü düzeyde nasıl programlanıyor?


Bence "Tamam" bir soru (kıvrık ve belki de bir kitabın cevaplanması gerekiyor - ki bu iyi bir format değil, bu yüzden burada ne tür sorulara aşina olabileceğinizi öğrenmek için yardım merkezini ve tur sayfalarını görün) .
Doktoro Reichard

Yardım merkezini okumuyorum.

Neden olmasın diye sorsam sorun olur mu?
Doktoro Reichard

Çünkü durmak, daha iyi zaman durmak gibi "Tamam" sorumu çözmek ve cevaplamak için harcanabilir geçirilebilir.

Söylediğim gibi, bu soruyu doğru bir şekilde cevaplamak için muhtemelen bir kitaba ihtiyacınız olacaktır ... uzun cevaplar genellikle iyi cevaplar değildir.
Doktoro Reichard

Yanıtlar:


8

Temel olarak, GPU'lar her şeyi nasıl yapılacağını nasıl biliyor? Bir sürücü temel olarak bir sürücünün sağladığı özel talimatları kullanarak ikili verileri görüntülemek için mümkün veya gerekli olan her küçük, içsel veya donanım devre düzeyi işlevini kontrol ediyor mu?

Hayır, cihazın kendi IC'leri vardır ve cihazın çalışmasının tüm donanım seviyesi yönlerini kontrol eder ve cihazdaki yönleri koordine eden ve kullanılabilecek daha üst düzey bir programlama arayüzü sağlayan merkezi bir işlemciyle arabirim oluşturur. cihaza erişmek, cihazı okumak, cihaza yazmak ve cihazı kontrol etmek için.

Öyleyse, GPU bir CPU'nun yaptığı gibi gönderilen talimatları anlamak için "özel" bir dil veya "birleştirme" kullanıyor mu?

Evet ve hayır. Çoğu cihaz gibi, video kartları da konuları basitleştirmek için standartlar kullanır. Önyükleme zamanı videosu gibi normal işlevlere erişmek için VESA veya GPU programlama işlevlerine erişmek için CUDA gibi standartları kullanırlar . Buna ek olarak, programlar cihazın programlama belgelerine (adaptörün web sitesinden ulaşılabilir) bağlı olarak standart olmayan veya cihaza bağlı işlevlere doğrudan makine kodunu (montajcıya derlenmiş C) kullanarak erişebilir.

Bilgilerimde çok fazla boşluk var ve GPU'ların arkasında ve onlara doğrudan donanım aracılığıyla erişmekte hoş olmayan bir "gizem" var.

Sürücüler aygıta doğrudan erişir, bu nedenle özel erişimleri vardır (düzenli kullanıcı düzeyi programların güvenlik ve kararlılık nedeniyle donanımlara doğrudan Vista + 'da erişmesine izin verilmez). Bağlantı noktalarını, DMA ( Doğrudan Bellek Erişimi ) ve bellek eşlemesini kullanarak cihaza erişin .

Örneğin, bir GPU ve CPU bir şekilde bağlanabilmelidir, bu nedenle bir GPU'ya CPU montajı ile ve doğru veri / adres veriyollarını uygulayarak erişmek mümkündür. Bir aygıt satıcısının GPU'yu bir sürücü dışında erişmesini imkansız kılamaz, çünkü sürücü de derlenmiş bir koddur ve programlanabilir bir devre olarak GPU'nun ikili talimatlarla çalışması gerekir.

Bir sürücü, bellek eşlemeli bağlantı noktalarına ve benzerlerine erişerek cihazı düzenli CPU talimatları ile okuyabilir ve yazabilir. Anlaşılması kolay bir örnek olarak, B8000 adresindeki "belleğe" yazarak metin modunda ekrana bir karakter koyabilirsiniz. Bu adres RAM değildi, daha ziyade video kartının belleğine karşılık gelecek şekilde eşlendi, bu yüzden ona yazmak ekrana yazacaktı. Aynı şekilde, içinde yazma istediğiniz karakteri koyarak türünü ekranı yazabilirim AL, kayıt 0x09içinde AHBIOS arama kesme sonra kayıt ve 0x10. Daha gelişmiş işlevler farklı değildir; bağdaştırıcının belleğini okuyabilir ve yazabilir, çipindeki işlevleri çağırabilir ve böylece aygıtın gösterdiği ve belgelediği tüm giriş (ler) i kullanabilirsiniz.

Yani gerçekten ... bunun yazılım ve donanım ile ilgili "tamam" bir soru olduğu varsayılarak, herkes satıcıya özgü dosyalar olmadan bir GPU'ya doğrudan erişebilir, çünkü dosyalar büyülü değildir.

Yalnızca standartlara uyan özellikler, ancak diğer her şey (yani daha gelişmiş şeyler) için üreticinin programlama belgelerine başvurmanız gerekir.

Peki GPU'lar donanıma özgü doğrudan donanım perspektifinden donanıma özgü düzeyde nasıl programlanıyor?

Birden fazla katman aracılığıyla:

  1. Transistörler ve benzeri katı hal bileşenleri
  2. Düşük seviye ASIC'ler
  3. Yerleşik işlemci (ler) ve yonga setleri
  4. Düşük seviye programlama arayüzleri (montaj)
  5. Yüksek seviye programlama arayüzleri (DirectX, OpenGL)
  6. Üst düzey programlama dili (C ++, C #, Python vb.)

1
'çıplak metal' ile ilgili not; Çoğu oyun geliştiricisinin bahsettiğini duymanız durumunda, kartların kendi makine diline derleyen kod yazmak yerine DirectX / OpenGL gibi üst düzey soyutlamaları kullanmak zorunda olduklarından şikayet ediyorlar. Nvidia'nın FERMI GPU'ları tarafından kullanılan birleştirici dili hakkında bilgi için buraya bakın code.google.com/p/asfermi CUDA'nın bile makine koduna derlenen yüksek seviyeli bir dilin (PTX) üzerine oturduğunu unutmayın, böylece CUDA'da programladığınız kodlar derlenmiş çıktı ile aynı değildir.
Frank Thomas

Hey, bu yazıda bahsettiğiniz şeyleri kapsayan bir üniversite öğrencisi için uygun bir kitap öneriniz olabilir mi? Hiç GPU programlamasıyla ilgilenmiyorum, ancak hepsinin nasıl çalıştığı konusundaki anlayışımdaki boşluklar sinir bozucu.
lanza

2

Ben bilgisayar mimarisinde tam bir dahi değilim, ama sorunuzu en iyi şekilde bilgimle en iyi şekilde ele almaya çalışacağım.


Bir aygıt sürücüsü, ekranımda gördüğüm her şeyden sorumludur, bunu yazdığım gibi ekran da güncellenir (bu, elbette, Windows gibi bir işletim sistemi kapsamındadır).

Bu doğrudur, çünkü GPU ile doğrudan etkileşimin uygulanması kolay değildir. Dolayısıyla DirectX ve OpenGL gibi grafik çerçevelerin geliştirilmesi.

Wikipedia'nın bu kullanışlı tanımı bunu daha ayrıntılı olarak açıklıyor:

Bir aygıt sürücüsü, bir donanım aygıtı ile onu kullanan uygulamalar veya işletim sistemleri arasında çevirmen görevi görerek programlamayı kolaylaştırır. Programcılar, son kullanıcının kullandığı özel donanımdan bağımsız olarak üst düzey uygulama kodunu yazabilir.


Temel olarak, GPU'lar her şeyi nasıl yapılacağını nasıl biliyor? Bir sürücü temel olarak bir sürücünün sağladığı özel talimatları kullanarak ikili verileri görüntülemek için mümkün veya gerekli olan her küçük, içsel veya donanım devre düzeyi işlevini kontrol ediyor mu?

GPU'lar mikroişlemcilerdir. Bu şekilde işliyorlar. CPU'dan (elemanların konumu) beslenen verileri uygun bir ekrana işlerler. Her şeyi nasıl yapacaklarını biliyorlar çünkü bu şekilde üretiliyorlar ve çok sayıda insan GPU'ya veri göndermek ve GPU'dan veri göndermek için uygun yollar üzerinde anlaştılar.

Ekran sürücüsünü bir arabellek veya proxy olarak düşünün. Bir program penceresi olduğunuzu ve kullanıcının sizi yukarı taşıdığını düşünün. GPU'dan ekranı yenilemesini istersiniz. Ancak GPU, Klingon'u konuştuğunda ve siz Vulcan'ı konuştuğunuzda , sürücü komutunuzu alır ve komutunu yaptığınız işi GPU'ya çevirir.

Öyleyse, GPU bir CPU'nun yaptığı gibi gönderilen talimatları anlamak için "özel" bir dil veya "birleştirme" kullanıyor mu?


Gönderen Vikipedi :

ARB montaj dili, montaj dili olarak nitelendirilebilen düşük seviyeli bir gölgelendirme dilidir. Donanım grafik boru hattını kontrol eden GPU talimatlarını standartlaştırmak için OpenGL Mimari İnceleme Kurulu (ARB) tarafından oluşturuldu.

Bu örnek var ve bireysel üreticilerin (NVIDIA, ATI) kendi talimat setlerine sahip olduklarını unutmayın.

Ayrıca OpenCL ve bir şekilde doğrudan GPU'ya talimatları programlamanın birçok yolu vardır.

Bütün bunlar sorunuzu bir dereceye kadar cevaplamalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.