2011-10-12 22 views
1

OpenCLでは、すべてのスレッドが共通の値をほとんど計算する必要はありません。次の2つのケースのどちらが高速ですか? 1.すべてのスレッドは値を計算し、プライベートメモリに格納し、スレッド間の同期は必要ありません。 2. 1つのスレッドがローカルメモリに計算して格納します。バリアによって同期化される。ワークグループのすべてのスレッドは、ローカルメモリの値にアクセスします。OpenCL - パフォーマンスへの障壁の影響

ありがとうございました。

答えて

2

OpenCLが実行されるデバイスの範囲(たとえば、さまざまなGPU、さまざまなCPU、およびCell BE)があれば、これに対する正解はありますか?性能特性は、CPUとGPU、さらにはGPUベンダーとモデルの間で大きく異なります。

あなたやあなたのユーザーが関心のあるプラットフォームや実装について、測定する必要があります。

ホスト上のいくつかの共通の値をあらかじめ計算し、OpenCLカーネルの動的パラメータとして、またはOpenCLカーネルへのコンパイル時のパラメータとして渡すことは可能でしょうか?

2

これらの共通の値の計算の複雑さ、および並行して実行できる作業項目の数によって異なります。

一般的な値を計算する時間をA、残りの計算を行う時間をB、障壁のオーバーヘッドをAO & BO(A部分とB部分)とします。各オプションの時間を計算できます。

  • オプション1とシングルスレッド1000の作業項目:1000A + 1000B
  • オプション2とシングルスレッド1000の作業項目:A + AO + 1000B + 1000BO
  • オプション1~1000スレッドと、および1000の作業項目:A + B
  • オプション2 1000年とスレッドと1000の作業項目:A + AO + B + BO

あなたが作業項目のように多くのスレッドを持っている場合は、オプション2は明らかに遅くなります。 単一のスレッドがある場合、BOがAに比べて小さい場合、オプション2はおそらくより速いでしょう。

真実はおそらく中間のどこかにあります。

オプション3では、ホストがこれらの値を計算し、結果を定数メモリに格納します。これを行い、少しダブルバッファリングを使用すると、おそらくOpenCLが現在の計算を行うのを待っている間に次の共通の値を計算する時間を隠すことができます。

+0

すべてのスレッドを同時に実行できるという保証はないので、1000スレッドの場合、オプション1のn * A + n * B、A + n *オプション2のAO + n * B + n * BOです。そして、スレッドの例がどのように意味を成しているのか分かりません。なぜそのスレッドは、それ自身と同期化するための障壁も必要ないときに、Aを1000回再計算するでしょうか? – Grizzly

+0

さらに、アーキテクチャとAの計算方法によっては、リソースの競合が発生して、複数のスレッドが同じメモリにアクセスしようとしているためにAの計算が遅くなることがあります。 m> = 1のオプション1の場合はm * n * A + n * Bになります)。したがって、最終的には、アーキテクチャー、糸の量、計算コストAと障壁のコストとの間に何の答えも出すことは本当に可能ではありません – Grizzly

関連する問題