Wie programmieren Gerätetreiberanweisungen die GPU?

9

Angenommen, ich benutze einen Computer, jeden typischen modernen Computer mehr oder weniger. Ein Gerätetreiber ist für alles verantwortlich, was ich auf meinem Bildschirm sehe, einschließlich der Aktualisierung des Bildschirms während der Eingabe (dies liegt natürlich im Rahmen eines Betriebssystems wie Windows).

Lassen Sie uns dies auf die Ebene reduzieren, auf der es der Hardware egal ist, ob es einen Kernel gibt oder nicht, und nur Anweisungen entgegennimmt.

Woher "wissen" GPUs genau, wie man alles macht? Steuert ein Treiber grundsätzlich jede winzige, intrinsische oder Hardware-Funktion auf Schaltungsebene, die möglich oder erforderlich ist, um Binärdaten für die Anzeige mithilfe spezieller Anweisungen zu berechnen, die ein Treiber bereitstellt?

Wenn ja, verwendet die GPU eine "spezielle" Sprache oder "Assembly", um die an sie gesendeten Anweisungen zu verstehen, wie dies eine CPU tut?

Ich habe zu viele Wissenslücken und es gibt dieses unangenehme "Geheimnis" hinter GPUs und dem direkten Zugriff über Hardware.

Zum Beispiel müssen eine GPU und eine CPU in der Lage sein, sich irgendwie zu verbinden, damit es möglich ist, über eine CPU-Baugruppe auf eine GPU zuzugreifen und die richtigen Daten- / Adressbusse zu implementieren. Ein Gerätehersteller kann es unmöglich machen, außerhalb eines Treibers auf die GPU zuzugreifen, da ein Treiber auch aus kompiliertem Code besteht und die GPU als programmierbare Schaltung mit binären Anweisungen arbeiten muss.

Ich habe diese Art von Fragen gestellt und sie werden heftig schnell gelöscht, ohne Antwort, warum auf vielen Websites. Was ist also das große Geheimnis / Geheimnis hier? Es ist eine Hardware auf einem Motherboard, auf die wie auf jedes andere zugegriffen wird.

Also wirklich ... vorausgesetzt, dies ist hier eine "ok" -Frage in Bezug auf Software und Hardware, kann jeder ohne herstellerspezifische Dateien direkt auf eine GPU zugreifen, da die Dateien nicht magisch sind.

Wie werden GPUs aus der Bare-Metal-Perspektive der direkten Hardware auf hardwarespezifischer Ebene "programmiert"?


quelle
Eine "OK" -Frage scheint meiner Meinung nach (obwohl sie kompliziert ist und möglicherweise ein Buch zur Beantwortung erfordert - was kein gutes Format ist. Sehen Sie sich also zuerst die Hilfe und die Tour- Seiten an, um sich mit den Fragen vertraut zu machen, die Sie hier stellen können.) .
Doktoro Reichard
Ich lese nicht die Hilfe.
Stört es mich, wenn ich frage, warum nicht?
Doktoro Reichard
Weil man besser nachdenken kann, um meine "OK" -Frage so wie sie ist zu lösen und zu beantworten.
Und wie gesagt, um diese Frage richtig zu beantworten, brauchst du wahrscheinlich ein Buch ... lange Antworten sind normalerweise keine guten Antworten.
Doktoro Reichard

Antworten:

8

Woher "wissen" GPUs genau, wie man alles macht? Steuert ein Treiber grundsätzlich jede winzige, intrinsische oder Hardware-Funktion auf Schaltungsebene, die möglich oder erforderlich ist, um Binärdaten für die Anzeige mithilfe spezieller Anweisungen zu berechnen, die ein Treiber bereitstellt?

Nein, das Gerät verfügt über eigene ICs, die alle Aspekte der Hardwarefunktion auf Geräteebene steuern. Sie sind mit einem Zentralprozessor verbunden, der die Aspekte auf dem Gerät koordiniert, und bieten eine übergeordnete Programmierschnittstelle, die verwendet werden kann um auf das Gerät zuzugreifen, von ihm zu lesen, darauf zu schreiben und es zu steuern.

Wenn ja, verwendet die GPU eine "spezielle" Sprache oder "Assembly", um die an sie gesendeten Anweisungen zu verstehen, wie dies eine CPU tut?

Ja und nein. Wie die meisten Geräte verwenden Grafikkarten Standards zur Vereinfachung. Sie verwenden Standards wie VESA, um auf die regulären Funktionen wie Boot-Time-Video zuzugreifen , oder CUDA, um auf GPU-Programmierfunktionen zuzugreifen. Darüber hinaus können Programme direkt auf die nicht standardmäßigen oder geräteabhängigen Funktionen zugreifen, indem sie Maschinencode (häufig C für Assembler kompiliert) in Verbindung mit den Programmierdokumentationen des Geräts (die auf der Website des Adapters verfügbar sind) verwenden.

Ich habe zu viele Wissenslücken und es gibt dieses unangenehme "Geheimnis" hinter GPUs und dem direkten Zugriff über Hardware.

Treiber greifen direkt auf das Gerät zu, weshalb sie über einen speziellen Zugriff verfügen (reguläre Programme auf Benutzerebene dürfen aus Sicherheits- und Stabilitätsgründen nicht direkt auf Hardware in Vista + zugreifen). Der Zugriff auf das Gerät über Ports, DMA ( Direct Memory Access ) und Speicherzuordnung .

Zum Beispiel müssen eine GPU und eine CPU in der Lage sein, sich irgendwie zu verbinden, damit es möglich ist, über eine CPU-Baugruppe auf eine GPU zuzugreifen und die richtigen Daten- / Adressbusse zu implementieren. Ein Gerätehersteller kann es unmöglich machen, außerhalb eines Treibers auf die GPU zuzugreifen, da ein Treiber auch aus kompiliertem Code besteht und die GPU als programmierbare Schaltung mit binären Anweisungen arbeiten muss.

Ein Treiber kann das Gerät mit regulären CPU-Anweisungen lesen und schreiben, indem er auf speicherabgebildete Ports und dergleichen zugreift. Als leicht verständliches Beispiel können Sie ein Zeichen im Textmodus auf den Bildschirm bringen, indem Sie unter der Adresse B8000 in den Speicher schreiben. Diese Adresse war kein RAM, sondern wurde so zugeordnet, dass sie dem Speicher der Grafikkarte entspricht, sodass beim Schreiben auf den Bildschirm geschrieben wird. Ebenso können Sie auf den Bildschirm schreiben, indem Sie das Zeichen, das Sie schreiben möchten, in die ALRegistrierung und 0x09in das AHRegister einfügen und dann den BIOS-Interrupt aufrufen 0x10. Erweiterte Funktionen unterscheiden sich nicht. Sie können den Speicher des Adapters lesen und schreiben, die Funktionen auf seinem Chip aufrufen usw., indem Sie alle vom Gerät bereitgestellten und dokumentierten Schnittstellen verwenden.

Also wirklich ... vorausgesetzt, dies ist hier eine "ok" -Frage in Bezug auf Software und Hardware, kann jeder ohne herstellerspezifische Dateien direkt auf eine GPU zugreifen, da die Dateien nicht magisch sind.

Nur für Funktionen, die den Standards entsprechen, aber für alles andere (dh für fortgeschrittenere Funktionen) müssen Sie die Programmierdokumente des Herstellers konsultieren.

Wie werden GPUs aus der Bare-Metal-Perspektive der direkten Hardware auf hardwarespezifischer Ebene "programmiert"?

Durch mehrere Schichten:

  1. Festkörperkomponenten wie Transistoren und dergleichen
  2. Low-Level- ASICs
  3. On-Board-Prozessor (en) und Chipsätze
  4. Low-Level-Programmierschnittstellen (Assembly)
  5. Übergeordnete Programmierschnittstellen (DirectX, OpenGL)
  6. Programmiersprache auf hoher Ebene (C ++, C #, Python usw.)
Synetech
quelle
1
Anmerkung zu 'Bare Metal'; Für den Fall, dass Sie die meisten Spieleentwickler sprechen hören, beschweren sie sich, dass sie Abstraktionen auf hoher Ebene wie DirectX / OpenGL verwenden müssen, anstatt Code zu schreiben, der auf die maschinenspezifische Maschinensprache kompiliert wird. Informationen zur Assembler-Sprache, die von den FERMI-GPUs von Nvidia verwendet wird, finden Sie hier. code.google.com/p/asfermi Beachten Sie, dass sich sogar CUDA auf einer High-Level-Sprache (PTX) befindet, die in Maschinencode kompiliert wird nicht mit der kompilierten Ausgabe identisch sein.
Frank Thomas
Hey, haben Sie vielleicht einen guten Buchvorschlag für einen College-Studenten, der die Dinge behandelt, über die Sie in diesem Beitrag gesprochen haben? Ich bin nicht daran interessiert, jemals in der GPU-Programmierung zu arbeiten, aber die Lücken in meinem Verständnis, wie das alles funktioniert, sind frustrierend.
Lanza
2

Ich bin nicht gerade ein Genie in der Computerarchitektur, aber ich werde versuchen, Ihre Frage nach bestem Wissen und Gewissen nach Punkten zu behandeln.


Ein Gerätetreiber ist für alles verantwortlich, was ich auf meinem Bildschirm sehe, einschließlich der Aktualisierung des Bildschirms während der Eingabe (dies liegt natürlich im Rahmen eines Betriebssystems wie Windows).

Dies ist vor allem deshalb der Fall, weil die direkte Interaktion mit der GPU nicht einfach zu implementieren ist. Daher die Entwicklung von Grafik-Frameworks wie DirectX und OpenGL.

Diese handliche Definition aus Wikipedia erklärt dies genauer:

Ein Gerätetreiber vereinfacht die Programmierung, indem er als Übersetzer zwischen einem Hardwaregerät und den Anwendungen oder Betriebssystemen fungiert, die es verwenden. Programmierer können den übergeordneten Anwendungscode unabhängig von der vom Endbenutzer verwendeten Hardware schreiben.


Woher "wissen" GPUs genau, wie man alles macht? Steuert ein Treiber grundsätzlich jede winzige, intrinsische oder Hardware-Funktion auf Schaltungsebene, die möglich oder erforderlich ist, um Binärdaten für die Anzeige mithilfe spezieller Anweisungen zu berechnen, die ein Treiber bereitstellt?

GPUs sind Mikroprozessoren. Als solche verarbeiten sie. Sie verarbeiten Daten, die von der CPU (dh der Position der Elemente) einer ordnungsgemäßen Anzeige zugeführt werden. Sie "wissen", wie man alles macht, weil sie auf diese Weise hergestellt werden und eine große Gruppe von Menschen sich auf die richtigen Wege zum Senden von Daten zur und von der GPU geeinigt hat.

Stellen Sie sich den Anzeigetreiber als Puffer oder Proxy vor. Stellen Sie sich vor, Sie sind ein Programmfenster und der Benutzer bewegt Sie nach oben. Sie fordern die GPU auf, die Anzeige zu aktualisieren. Aber wenn die GPU klingonisch spricht und Sie Vulkanisch sprechen , erhält der Treiber Ihren Befehl und übersetzt ihn in die GPU, die wiederum das tut, was Sie befohlen haben.

Wenn ja, verwendet die GPU eine "spezielle" Sprache oder "Assembly", um die an sie gesendeten Anweisungen zu verstehen, wie dies eine CPU tut?


Aus Wikipedia :

Die ARB-Assemblersprache ist eine Schattierungssprache auf niedriger Ebene, die als Assemblersprache charakterisiert werden kann. Es wurde vom OpenGL Architecture Review Board (ARB) erstellt, um GPU-Anweisungen zu standardisieren, die die Hardware-Grafik-Pipeline steuern.

Es gibt dieses Beispiel, und denken Sie daran, dass einzelne Hersteller (NVIDIA, ATI) ihre eigenen Befehlssätze haben.

Es gibt auch OpenCL und viele andere Möglichkeiten, um Anweisungen in gewisser Weise direkt auf die GPU zu programmieren.

All dies sollte Ihre Frage bis zu einem gewissen Grad beantworten.

Doktoro Reichard
quelle