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


9

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

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

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

そうである場合、GPUは「特殊な」言語または「アセンブリ」を使用して、CPUと同様に送信される命令を理解しますか?

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

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

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

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

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


私の意見では「OK」の質問のようです(複雑で、答えるのに本が必要な場合があります-これは良い形式ではないため、ヘルプセンターツアーページを最初に見て、ここで尋ねられる質問の種類に慣れてください) 。
ドクトロライチャード

ヘルプセンターを読んでいません。

なぜ聞かないのですか?
ドクトロライチャード

より良い時間を熟考するのに費やすことができるので、現状の「OK」の質問を解決して答えようとします。

そして、私が言ったように、この質問に適切に答えるには、おそらく本が必要でしょう...長い答えは通常良い答えではありません。
Doktoro Reichard

回答:


8

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

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

そうである場合、GPUは「特殊な」言語または「アセンブリ」を使用して、CPUと同様に送信される命令を理解しますか?

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

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

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

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

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

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

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

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

複数の層を通して:

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

1
「ベアメタル」に関する注意; ほとんどのゲーム開発者の話を聞いた場合、彼らはカードのマシンのラングにコンパイルするコードを書くのではなく、DirectX / OpenGLのような高レベルの抽象化を使用しなければならないと文句を言っています。NvidiaのフェルミのGPUが使用するアセンブラlangague上の情報についてはこちらをご覧くださいcode.google.com/p/asfermiのも、CUDAは、マシンコードにコンパイルされるハイレベルのlangague(PTX)の上に座っていることに注意してください、そうopcoodesあなたはCUDAにプログラムすることができますコンパイルされた出力と同じではありません。
フランクトーマス

ねえ、この投稿で話したことをカバーする大学生に適した良い本の提案がありますか?GPUプログラミングに取り組むことに興味はありませんが、それがどのように機能するかを理解する上でのギャップは苛立たしいものです。
ランザ

2

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


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

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

Wikipediaのこの便利な定義は、これをさらに詳しく説明しています。

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


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

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

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

そうである場合、GPUは「特殊な」言語または「アセンブリ」を使用して、CPUと同様に送信される命令を理解しますか?


ウィキペディアから:

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

この例があり、個々のメーカー(NVIDIA、ATI)が独自の命令セットを持っていることを思い出してください。

また、OpenCLなど、GPUに直接命令をプログラムする方法が数多くあります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.