2016-07-03 7 views
1

私は画像処理アプリケーション、グレースケール画像で働いています - GPU占有率ベクトルの増加数によって制限されているワークグループおよびワークグループごとローカルメモリごとを登録します。のfloat4 - 積和 - パフォーマンスのヒントOpenCLの

read_imagef()関数は、のfloat4を返ししかし、私のアプリケーションは、のfloat4の最初コンポーネントと連携 - ので、任意の計算(あたりの余分なフロート動作は、したがってある実行時間が長くなります)。それにもかかわらず

- カーネルは、多くの乗算が、それはあまりベクトル・レジスタを使用するように私はこのカーネルを最適化するにはどうすればよいのfloat4

にも OPSを追加実行している場合を高めるためのヒント、トリックですMAD opsスピード(ハー​​ドウェアでサポートされている機能を試して性能が低下したことを知っている)

答えて

2

グレースケール画像のみで作業する場合は、画像の1つのチャンネルのみを読み取る 'read_imagef()'を実装することができます。その結果、対処するすべてがfloatになります。


データには、RGBRGB...というようにインターリーブされている可能性があります。 Rチャンネルのみをロードすることは、すべてのチャンネルをロードすることとおそらく同じ時間を要する。構造体の配列です。ここで詳細を見つけることができます。データレイアウトを考えると

Structure of Arrays vs Array of Structures in cuda

、あなたは、float4/float3をロードし、それからfloatの一つのチャネルを抽出し、抽出したfloat上の計算を行うことができます。

カーネルは、多くの乗算ものfloat4

にOPSを追加実行するカーネルがするfloat4上で、これらのオペレーションを行う必要があり、なぜ私は得ることはありません。たぶん、デモのコードをいくつか表示したいかもしれません。

+0

これは解決策かもしれませんが、読み込みアクセスパターンによって計算がストールする可能性があります。私のマシンではfloat4の読み込みがより効率的ですので、パフォーマンスは** CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT **によって制限されます。 – OmarGW

+0

@OmarGW 3つのチャンネルすべてにアクセスしますか? – kangshiyin

+0

3つのchannelaにアクセスすると、より良いパフォーマンスが得られます。 -----私自身のread_imagef **の実装についてのあなたの考えは? – OmarGW

0

ハードウェアの種類と画像コンテンツに何をしているかによって画像の内容が変わることはありません。これはHWがあると仮定して、変換を行うGPUでのテクスチャユニットの使用を減らします)。

もう1つの方法は、float4の4つの値を「マージ」し、数値を計算し、結果を分割することです。

残念ながら、OpenCLは「ポータブル」ですが、「既知のパフォーマンスでは移植性がありません」ので、1つのOpenCL実装でうまくいくものは別のものではうまくいかず、パフォーマンスのアルゴリズムを微調整する必要があります。アーキテクチャ全体として。

+0

3つのコンポーネント(中間結果用)を手作業で使用し、それをfloat4に戻してパフォーマンスを向上させ、ベクトルレジスタの数を減らしました。多分もっと大きな問題サイズのために、これは有益かもしれません。 --- パフォーマンスの移植性の問題については、これはCUDAと違ってOpenCLの悪夢です。 – OmarGW

1

浮動小数点数4を返し、同じ浮動小数点数の浮動小数点演算で同じ浮動小数点数を使用すると、同じ遅延が発生します。マッド操作はメモリ操作よりもはるかに短いレイテンシです。

私が知っているようにfloat3ハードウェアはありません。したがって、スカラーマイクロアーキテクチャ(新しいGPUなど)の場合、3つの要素を1つずつ計算できます。それがvliw-4であれば、同時に4番目の要素を使用するかどうか、同じ速度になります。

+0

これは実際には同じレイテンシですが、float4では4つのfloat命令が使用されていますが、float3では3つの浮動命令が使用されますが、これにより実行時間が長くなります(私自身はこれをテストします)。 float4ではなくfloat3 – OmarGW

関連する問題