web-dev-qa-db-ja.com

デバイスドライバーの命令はGPUをどのようにプログラムしますか?

私がコンピュータを使用しているとしましょう。典型的な現代のコンピュータは多かれ少なかれ使用しています。デバイスドライバーは、これを入力すると画面が更新されることを含め、画面に表示されるすべての責任を負います(もちろん、これはWindowsなどのOSの範囲内です)。

これを、ハードウェアがカーネルの有無を気にせず、指示を受け取るレベルまで下げましょう。

基本的に、GPUはどのようにしてすべてを正確に「知る」のでしょうか。ドライバーは基本的に、ドライバーが提供する特別な命令を使用して表示用のバイナリデータを計算するために可能な、または必要なすべての微小、固有、またはハードウェア回路レベルの機能を制御しますか?

もしそうなら、GPUはCPUのように送信された命令を理解するために「特別な」言語または「アセンブリ」を使用しますか?

私の知識にはあまりにも多くのギャップがあり、GPUの背後にあるこの不快な「謎」があり、ハードウェアを介して直接GPUにアクセスしています。

たとえば、GPUとCPUは何らかの方法で接続できる必要があるため、CPUアセンブリを介してGPUにアクセスし、正しいデータ/アドレスバスを実装することができます。ドライバーもコンパイルされたコードであり、プログラマブル回路としてのGPUはバイナリ命令で動作する必要があるため、デバイスベンダーがドライバーの外部でGPUにアクセスできないようにする方法はありません。

私はこれらのタイプの質問をしました、そしてそれらはなぜ多くのサイトで答えがないのに激しく素早く削除されます、それでここで大きな謎/秘密は何ですか?これは、他の方法と同じようにアクセスされるマザーボード上のハードウェアです。

だから本当に...これがソフトウェアとハ​​ードウェアに関するここでの「大丈夫」な質問だと仮定すると、ファイルは魔法ではないので、誰でもベンダー固有のファイルなしでGPUに直接アクセスできます。

では、ハードウェア固有のレベルで、ベアメタルの直接的なハードウェアの観点からGPUをどのように「プログラム」するのでしょうか。

9
user268540

基本的に、GPUはどのようにしてすべてを正確に「知る」のでしょうか。ドライバーは基本的に、ドライバーが提供する特別な命令を使用して表示用のバイナリデータを計算するために可能な、または必要なすべての微小、固有、またはハードウェア回路レベルの機能を制御しますか?

いいえ、デバイスには、デバイスの機能のハードウェアレベルのすべての側面を制御する独自のICがあり、デバイス上の側面を調整する中央処理装置とインターフェイスし、使用できる高レベルのプログラミングインターフェイスを提供します。デバイスへのアクセス、読み取り、書き込み、および制御。

もしそうなら、GPUはCPUのように送信された命令を理解するために「特別な」言語または「アセンブリ」を使用しますか?

はいといいえ。ほとんどのデバイスと同様に、ビデオカードは問題を単純化するために 標準 を使用します。 [〜#〜] vesa [〜#〜] のような標準を使用して、起動時のビデオなどの通常の関数にアクセスしたり、 [〜#〜] cuda [〜#〜] GPUプログラミング機能にアクセスします。さらに、プログラムは、デバイスのプログラミングドキュメント(アダプタのWebサイトから入手可能)と組み合わせてマシンコード(多くの場合、Cでアセンブラにコンパイル)を使用して、非標準またはデバイス依存の関数に直接アクセスできます。

私の知識にはあまりにも多くのギャップがあり、GPUの背後にあるこの不快な「謎」があり、ハードウェアを介して直接GPUにアクセスしています。

ドライバーはデバイスに直接アクセスするため、特別なアクセス権があります(セキュリティと安定性の理由から、通常のユーザーレベルのプログラムはVista +でハードウェアに直接アクセスできません)。ポート、DMA( ダイレクトメモリアクセス )、および メモリマッピング を使用してデバイスにアクセスします。

たとえば、GPUとCPUは何らかの方法で接続できる必要があるため、CPUアセンブリを介してGPUにアクセスし、正しいデータ/アドレスバスを実装することができます。ドライバーもコンパイルされたコードであり、プログラマブル回路としてのGPUはバイナリ命令で動作する必要があるため、デバイスベンダーがドライバーの外部でGPUにアクセスできないようにする方法はありません。

ドライバは、メモリマップドポートなどにアクセスすることにより、通常のCPU命令でデバイスの読み取りと書き込みを行うことができます。わかりやすい例として、アドレスB8000の「メモリ」に書き込むことで、テキストモードで画面に文字を表示できます。このアドレスはRAMではなく、ビデオカードのメモリに対応するようにマップされていたため、このアドレスに書き込むと画面に書き込まれます。同様に、書き込みたい文字をALレジストリに入れ、0x09AHレジスタに入れてから、BIOS割り込み0x10を呼び出すことで画面に書き込むことができます。より高度な機能も同じです。アダプタのメモリの読み取りと書き込み、チップ上の関数の呼び出しなど、デバイスが公開して文書化するinetrfaceを使用できます。

だから本当に...これがソフトウェアとハ​​ードウェアに関するここでの「大丈夫」な質問だと仮定すると、ファイルは魔法ではないので、誰でもベンダー固有のファイルなしでGPUに直接アクセスできます。

標準に準拠する機能のみ、その他すべて(つまり、より高度な機能)については、製造元のプログラミングドキュメントを参照する必要があります。

では、ハードウェア固有のレベルで、ベアメタルの直接的なハードウェアの観点からGPUをどのように「プログラム」するのでしょうか。

複数のレイヤーを介して:

  1. トランジスタなどのソリッドステートコンポーネント
  2. 低レベル ASIC
  3. オンボードプロセッサとチップセット
  4. 低水準プログラミングインターフェイス(アセンブリ)
  5. 高レベルのプログラミングインターフェイス(DirectX、OpenGL)
  6. 高水準プログラミング言語(C++、C#、Pythonなど)
8
Synetech

私はコンピュータアーキテクチャの天才ではありませんが、私の知る限り、あなたの質問をポイントごとに扱うようにします。


デバイスドライバーは、これを入力すると画面が更新されることを含め、画面に表示されるすべての責任を負います(もちろん、これはWindowsなどのOSの範囲内です)。

これは、主にGPUとの直接の相互作用を実装するのが容易ではないためです。したがって、DirectXやOpenGLなどのグラフィックフレームワークの開発。

Wikipedia からのこの便利な定義は、これをより詳細に説明しています。

デバイスドライバーは、ハードウェアデバイスと、それを使用するアプリケーションまたはオペレーティングシステムとの間のトランスレーターとして機能することにより、プログラミングを簡素化します。プログラマーは、エンドユーザーが使用している特定のハードウェアに関係なく、高レベルのアプリケーションコードを記述できます。


基本的に、GPUはどのようにしてすべてを正確に「知る」のでしょうか。ドライバーは基本的に、ドライバーが提供する特別な命令を使用して表示用のバイナリデータを計算するために可能な、または必要なすべての微小、固有、またはハードウェア回路レベルの機能を制御しますか?

GPUはマイクロプロセッサです。そのため、それらは処理します。これらは、CPUから適切な表示に供給されるデータ(つまり、要素の位置)を処理します。彼らはそのように製造されているのでそして大勢の人々がデータを送受信する適切な方法に同意したので、彼らはすべてを行う方法を「知っています」 GPU。

ディスプレイドライバをバッファまたはプロキシと考えてください。あなたがプログラムウィンドウであり、ユーザーがあなたを上に移動したと想像してください。 GPUに表示を更新するように依頼します。しかし、GPUが話すとクリンゴン語、あなたが話すとバルカン、ドライバーはあなたのコマンドは、それをGPUに変換し、GPUはあなたがコマンドしたことを実行します。

もしそうなら、GPUはCPUのように送信された命令を理解するために「特別な」言語または「アセンブリ」を使用しますか?


から ウィキペディア

ARBアセンブリ言語は低レベルのシェーディング言語であり、アセンブリ言語として特徴付けることができます。これは、ハードウェアグラフィックスパイプラインを制御するGPU命令を標準化するために、OpenGL Architecture Review Board(ARB)によって作成されました。

この例があり、個々のメーカー(NVIDIA、ATI)には独自の命令セットがあることを忘れないでください。

また、 OpenCL や、ある意味で、GPUに命令を直接プログラムする他の多くの方法があります。

これはすべて、ある程度、あなたの質問に答えるはずです。

2