2012-01-19 40 views
3

浮動小数点数の代わりにOpenCLで浮動小数点数を使用すると利点はありますか?浮動小数点数浮動小数点数値

例えば

float3 position; 

float posX, posY, posZ; 

私はOpenCLのとひどく慣れていないんだけど、GPUができるので、GLSLでベクターを用いて数学をやってすることは、より効率的であるあなたに

答えて

8

ハードウェアによって異なります。

NVidia GPUはスカラーアーキテクチャを持っているので、ベクトルは純粋にスカラーコードを書くよりもほとんど利点がありません。 NVidia OpenCL best practices guideを引用する(PDFリンク):

CUDAアーキテクチャはスカラーアーキテクチャです。したがって、ベクトルタイプと命令を使用すると、パフォーマンスは向上しません。 これらは、 の便宜のためにのみ使用してください。 大きなベクトルを使用するよりも多くの作業項目を持つ方が一般的には良いです。

CPUとATI GPUを使用すれば、ベクトル命令を使用するため、ベクターを使用することでさらに多くの利点が得られます(ただし、これは最新のRadeonsで異なる可能性があると聞きました。私はこれを読む)。 CPUのATI Stream OpenCL programming guide(PDFリンク)、引用

:CPU(SSE)に

SIMD浮動小数点リソースは ベクトルタイプ(のfloat4)充填可能にするためにSSEコード生成及び抽出物の使用を必要とします SIMDハードウェアから優れたパフォーマンス。

This articleは、ベクターと純粋なスカラー型で書かれたカーネルのATI GPUでの性能比較を提供します。

+1

Radeon HD 7900シリーズをサポートする最新の「グラフィックスコアネクスト」アーキテクチャ(別名GCN)アーキテクチャは、基本的な演算ユニットとして16ワイドSIMDを使用するため、ベクトルタイプを使用する理由はまだあります。 – user57368

+0

皆さん、ありがとうございます。 – Michelle

+0

@ user57368:実際には、GCNはNVIDIAと同じように、理解していることから、スカラアーキテクチャのみをプログラムに公開しています。そこにベクタータイプを使用してください。 Afterall NVidiaはフェルミで16ワイドSIMDユニットも使用しますが、16スカラユニットとして公開されています。これはgpus上でvectortypesの有用性を大幅に減少させるはずです(そして、良いことであるnvidiaとamdを一緒にプログラミングすること) – Grizzly

1

ありがとうございましたすべてのNコンポーネントに同じ操作を同時に適用します。また、GLSLでは、ベクターは組み込みの言語機能としてドットプロダクトのような操作もサポートしています。

2

NvidiaアーキテクチャとAMDアーキテクチャの両方で、メモリは128ビットのバンクに分割されています。しばしば、単一のfloat3またはfloat4値を読み取ることは、3つの別々の浮動小数点を読み取るよりも高速です。

連続したメモリアドレスから浮動小数点値を読み取るときには、読み込みを組み合わせるためにコンパイラが大いに依存しています。 posX、posY、posZが同じバンクにあるという保証はありません。 float3として宣言すると、通常、コンポーネントの浮動小数点数が同じバンク内に収まるよう強制されます。

GPUがベクトル計算をどのように処理するかは、ベンダーによって異なりますが、両方のプラットフォームでのメモリアクセスにはベクトル化が役立ちます。

+0

これは真実かもしれませんが、nvidiaは、ベクトル命令を使用することによるメリットがないと述べたときには意味が異なります。しかし、float3/float4を使用してコンポーネントの場所が同じバンクに入ると言うとバックアップがありますか?これはコンパイラにも依存しませんか? – Zk1001

+0

確かにコンパイラに依存します。コンパイラ/ドライバがベクトル型を遅くする理由を考えることはできませんが。多くのピクセルタイプは3または浮動小数点数であり、gpusはそれをリースで最適化する必要があります。 – mfa

+0

私は同意し、あなたがいくつかの実験のような具体的な証拠を持っていれば知りたいと思います。 – Zk1001

関連する問題