CPUで実行される計算とGPUで実行される計算を制御するにはどうすればよいですか?


14

私の現在の理解では、シェーダーファイルで行われることはすべてGPUで行われ、私のコード(Javaの場合)で行われることはすべてCPUで行われます。

これは正確な説明ですか?


2
また、GPUでコードを実行できるOpenCLのようなものを使用して、GPUでコンピューティングを行うこともできます。
石鹸

回答:


20

それがその要点です。

原則として、プラットフォームは、おそらく、必要なことを何でも行うことができます。たとえば、x86から​​GPUコードへのコンパイルされたコードのジャストインタイム変換を行う高度なオペレーティングシステムを想像できます。同様に、OpenGLドライバーはホストCPUで何でも実行できます。

しかし、実際にあなたが今説明したのは、何が起こるかです。


5
IIRC、シェーダーはGPUに送信される前にCPUでコンパイルされます。そして、それはOSなしのGPUドライバーによって行われます。
–MSalters

本当です。Javaコードが既にコンパイルされている場合でも、シェーダーでプログラムを実行中に多くのコンパイルエラーを処理しました。
バシネーター

1
理論的:私は非常にCPUを集中的に使用するプログラムを持っていたが、単なるコマンドラインインターフェイス(グラフィカルな作業なし)だったとしましょう。作業の一部をGPUにオフロードできますか?私は実際にこれを行うことを計画していません、それは単に私が興味を持っている概念的なものです。
バシネーター

2
はい!@return trueが投稿したリンクは、それを行うJavaライブラリ用です。より一般的には、OpenGLで「計算シェーダー」を作成するか、OpenCLを使用できます。いずれの場合も、並列化可能なコードの一部を分離し、情報をやり取りする必要があります。(GPUは、「恥ずかしいほど並列」なタスクに最適です。)
デビッドヴァンブリンク

1
この答えに追加するアスタリスクの1つは、一部の実装が「プリシェーダー」の概念をサポートしていることです。つまり、シェーダーの一部であるが、その結果は特定の描画呼び出しのすべての呼び出しで一定です(均一なビューの乗算など) &射影行列)。そのように傾いたシェーダーコンパイラは、このようなコードのビットを識別し、GPUに送信された作業の結果の一定の出力を含めて、CPUサイドで一度実行されるようにそれらを持ち上げることができます。これは、「シェーダー= GPU」という前提が曲がっている可能性がある一般的なケースの1つです。
DMGregory

7

通常、はい。Javaは、CPUで実行されるプログラムを作成するために使用されます。シェーダー言語(cg、hlslなど)は、gpuで実行されるプログラムを作成するために使用されます。

ルールの例外は、ギャップを埋めることができるサードパーティのAPIを使用することです。


1
非常に興味深いヒント、「aparapi」へのリンク。GPUでJVMコードを実行します...興味深い!
デビッドヴァンブリンク

3

david van brinkは一般的にあなたの質問に答えました。

しかし、彼が言うように、OpenGLドライバーはCPU上で何かを実行でき、実際に多くのことが起こります。特に互換性コンテキストでは、グラフィックカードにいくつかの奇妙なレガシー機能を実装できません。ソフトウェアエミュレーションが必要です。たとえば、CPUで点描が実行される前に聞いたことがあります。ピッキングには驚きも期待できます。
これらの驚きは、Appleがハードウェアの範囲全体でOpenGLのビューを非常によく統一しており、一部の小さなハードウェアにはエミュレートする必要のあるものがないため、2.1コンテキストを使用するMacOSでさらに発生します。コンテキスト作成コードがソフトウェアデバイスを明示的に指定している場合、CPUでENTIRE OpenGL 2.1仕様を完全に実行できるようになります。

逆に、vexclやboost computeなどのコンピューティングライブラリ、またはMicrosoftのAMP、nVidiaスラストなどのコンピューティングライブラリを介して実行されるコードは、APIセットアップフラグに応じてGPUまたはCPUで実行できます。

最後に、CPU内にはDSPアーキテクチャもあり、その一部はSIMDと呼ばれています。インテルのispcコンパイラーは、コンパイル時に多くのパフォーマンス診断を使用してSIMDレーンで実行できるように「保証」されたコードを生成し、最大限に活用できるようにします。それにOpenMPを追加すると、マルチスレッドSIMDを取得できます。これはGPUの概念に近づきます。ハイエンドのCPUとローエンドのGPUを使用している場合、これは実際にパフォーマンスが向上します。
http://ispc.github.io/

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