web-dev-qa-db-ja.com

OpenCLとOpenGLの計算シェーダーの違いは何ですか?

OpenCLがGPUのメモリアーキテクチャを制御し、より良い最適化を可能にすることを知っていますが、これを除けば、ベクトル演算(加算、乗算、反転など)にコンピュートシェーダーを使用できますか?

55
Maiss

他のOpenGLシェーダータイプとは対照的に、計算シェーダーはコンピューターグラフィックスに直接関連せず、CUDAやOpenCLと同様に、基盤となるハードウェアのはるかに直接的な抽象化を提供します。カスタマイズ可能なワークグループサイズ、共有メモリ、グループ内同期、およびCUDAとOpenCLで知られ、愛されているすべてのものを提供します。

主な違いは基本的に次のとおりです。

  • OpenCL Cの代わりにGLSLを使用します。これらのプログラミング言語の間にはそれほど大きな違いはありませんが、高度なテクスチャタイプ(キューブマップ配列など)、高度なOpenCLにはないグラフィック関連のGLSL関数をすべて使用できますフィルタリング(ミップマッピング、まあまあ、おそらくミップレベルを自分で計算する必要があるでしょう)、および4x4行列や幾何関数のような少し便利なもの。
  • これは、他のGLSLシェーダーと同様のOpenGLシェーダープログラムです。これは、OpenGLとOpenCL/CUDAの間のインターフェイスが面倒になる可能性がある一方で、OpenGLデータ(バッファ、テクスチャ、画像など)へのアクセスが簡単なことを意味します。同様に、既存のOpenGLワークフローへの統合も簡単です。OpenCLのセットアップは、既存のグラフィックスパイプラインへの統合については言うまでもなく、単独の本です。

つまり、計算シェーダーは、他のシェーダーのグラフィックス手法とは対照的に、GPUプログラミングに対する通常の(OpenCL/CUDAのような)計算手法を示しながら、実際に既存のOpenGLアプリケーション内での使用を意図したものです。 OpenCL/CUDAの計算の柔軟性を持たないステージ(もちろん、他の利点も提供します)。そのため、計算タスクの実行は、一般的なコンピューティングを目的としない他のシェーダーステージにタスクを絞り込んだり、同期する必要のある追加のコンピューティングフレームワークを導入するよりも、柔軟で直接的かつ簡単です。

コンピュートシェーダーは、OpenCLで達成できるほぼすべてのことを、ハードウェアリソースに対する同じ柔軟性と制御、同じプログラミングアプローチで実行できる必要があります。そのため、実行したいタスクに適したGPUに適したアルゴリズム(CUDAまたはOpenCLでうまく機能する)があれば、はい、計算シェーダーでも実行できます。しかし、計算シェーダーのためだけにOpenGLを使用することはあまり意味がありません(これは現在でも、おそらく最初からリアルタイムコンピューターグラフィックスのフレームワークです)。このために、OpenCLまたはCUDAを使用できます。コンピューティングシェーダーの真の強みは、グラフィックスとコンピューティング機能を混在させるときに役立ちます。

56
Christian Rau

こちら を見てください。要約:

はい、OpenCLはすでに存在しますが、ヘビー級のアプリケーション(CFD、FEMなど)を対象としており、OpenGLよりもはるかに普遍的なです(GPUを超えて考えてください... IntelのXeon Phiアーキテクチャは50以上のx86コアをサポートします) )。

また、OpenGL/CUDAとOpenCLの間でバッファーを共有するのは面白くありません。

3
Rahul Banerjee