2012-02-05 6 views
2

いくつかのコードがCPUではなくGPUで実行されることがわかっている簡単な方法はありますか?コードがGPUまたはCPUを使用して実行されているかどうかはどのようにわかりますか?

+0

これはあまり決定的ではありませんが、Windowsでは[Process Explorer](http://technet.microsoft.com/en-us/sysinternals/bb896653)にGPU使用グラフがあります。したがって、それを使用するか、それがどのAPIを使用しているかを調べてください。 – PeterT

+3

GPUで実行しようとしている「コード」の種類について具体的に説明できますか?あなたは3つの異なるAPIをリストアップしています。これらのAPIはすべて、3つの全く異なる方法でGPU上で「コード」を実行します。 –

答えて

8

あなたは、CPUとGPUの間の仕事の分離について、あなたのコンセプトを理解する必要があると思います。何かをコーディングしてGPU実行を対象としない通常のコンパイラでコンパイルすると、コードは常にCPUを実行します。

メインプログラム内のOpenGL関数またはDirectX関数への呼び出しはすべてCPU上で実行されますが、「魔法の」変換レイヤはありません。しかし、それらの呼び出しの中には、描画三角形のようにGPUに何かをさせるものがあります。

CUDAおよびOpenCLは、データ並列実行アーキテクチャを目的とした言語です。 GPUはそのようなアーキテクチャです。しかし、CUDAとOpenCLのコードでは、CPU上で実行されるいくつかのホストプログラムが必要です。プログラマブルシェーダ(HLSL、GLSL)も同様です。

So:プログラムのホスト部分(作業環境の設定、レンダリング呼び出しまたはGPU実行の実行)はCPU上で実行されます。 GPU上で実行されるコードは、別々のコンパイル単位(OpenGLにアップロードされたGLSLシェーダコード、OpenCL/CUDAコンパイラでコンパイルされたOpenCL/CUDAコード)でコンパイルされます。

+0

glsl(.sh)のすべてのコードがGPUで動作していますか?ガウス/メジアンフィルタリングのようなもっと複雑な処理が必要な場合はどうすればよいですか?書く場合:float a = 0.5 * 0.7;これは何回ですか? 1ピクセルあたり1つ?私はちょうどそれがoneceを動かしてほしいと思うsomehingの平行していることおよびsomehingを制御することができますか?申し訳ありませんが、私は並列実行プログラミングには新しいです。 – flankechen

1

datenwolfによれば、標準コンパイラ(gccなど)でコンパイルされたコードはすべてCPU上で実行されます。 GPUで実行されるプログラムはシェーダと呼ばれます。シェーダの変数型はC/C++プログラムと異なり、構文もより厳しく制限されています。

古いグラフィックアプリケーションは、2種類のシェーダ(頂点とフラグメント)で動作します。頂点シェーダは、レンダラに送信されたジオメトリの任意の頂点で操作されました。フラグメントシェーダは頂点シェーダ(ジオメトリフェースにまたがって補間)からの出力を受け取り、スクリーンに描画されるジオメトリの各ピクセルまたはフラグメントで動作します。

現代のグラフィックはGeneral Purpose GPU Programmingのアイデアを導入しました。 OpenGLのジオメトリシェーダとNvidiaのCUDAは、GPU上で汎用プログラミングを実行できます。

要約すると、コンパイルされたシェーダはGPU上で実行され、コンパイルされたC/C++はCPU上で実行されます。

+0

プレシェーダ時代はどうでしたか?GPU上でどのようなコードが実行されていましたか? –

+0

プレシェーダ時代はGPU時代に先行していたため、GPUのユーザが書いたコードは実行されませんでした。 – kevintodisco

1

どのOSでOpenGL/OpenCL/otherを使用しているかによって、システムプロファイラを使用してこの情報を得ることができます。システムプロファイラは、システム全体の活動を追跡し、追跡が完了した後に読み取り可能な形式で提示するソフトウェアです。 たとえば、Windowsの場合、CPUとGPUの両方を監視するVtuneを使用できます。

これが役に立ちます。

関連する問題