2012-04-20 8 views
2

こんにちは、私はバイトを比較する必要があるカーネル関数を持っています。検索したいエリアはブロックに分割されているので、4kバイトの配列は4k/256 = 16ブロックに分割されます。ブロック内の各スレッドはidxの配列を読み込み、それを別の配列と比較します。ここでは何を検索したいのですか?私はこれを2つの方法で行っています:CUDA共有メモリはグローバルより高速ではありませんか?

1.グローバルメモリ内のデータをコンパイルしますが、ブロック内のスレッドは同じアドレスを読み取る必要があります。

2.グローバルメモリから共有メモリにデータをコピーし、上記と同じ方法で共有メモリのバイトを比較します。同じアドレスを読み取ってもまだ問題があります。共有メモリへ コピーは次のようになります。コードの

myArray[idx] = global[someIndex-idx]; 
whatToSearch[idx] = global[someIndex+idx]; 

残りは同じです。例2のデータに対する操作のみが共有配列で実行されます。

しかし、最初のオプションは、共有メモリの場合よりも約10%高速です、なぜですか?説明をありがとう。

+0

完全な例を投稿してください。それがなければ、現在の答えのすべてが純粋な推測です。下の回答に対するあなたのコメントは、あなたがしていることを明確にするのに十分ではありません。 – harrism

答えて

9

データを一度しか使用しておらず、ブロック内の異なるスレッド間でデータの再利用がない場合は、共有メモリの使用は実際より遅くなります。その理由は、グローバルメモリから共有にデータをコピーするとき、グローバルトランザクションとしてカウントされるからです。共有メモリから読み込むと読み込みが高速になりますが、すでにグローバルから一度メモリを読み込まなければならないので問題はありません。また、共有メモリから読み込む2番目のステップは、価値のあるものを提供しない単なるステップです。

共有メモリを使用すると、同じデータを複数回アクセスする必要がある場合(同じスレッドか、同じブロック内の別のスレッドかに関係なく)に便利です。

+0

共有メモリは、非効率的なアクセスパターンを十分に融合したパターンに変換するのにも役立ちます。転置操作の場合 – Tom

1

グローバルメモリへのアクセスを節約するために共有メモリを使用していますが、各スレッドはグローバルメモリへのアクセスを2回行っているため、高速にはなりません。スピードの低下は、ブロック内のグローバルメモリ内の同じ場所にアクセスするスレッドが共有メモリ内の同じ場所にそのスレッドを読み取ろうとするため、シリアル化する必要があるためです。

あなたが投稿したコードから何をやっているのかよく分かりませんが、ブロック内のすべてのスレッドで集計された回数がglobalであることを確認してください共有メモリを使用する場合それ以外の場合は、パフォーマンスの向上は見られません。

+0

while(global_array [someIndex-idx + match] == global_array [someIndex + idx + match]); { マッチ++; } //分析されたデータでいくつかのものを行います。これは私がやっていることです。 – Hlavson

+0

ブロック内のスレッドがアクセスできるglobal_arrayの最大範囲は? someIndexはスレッド間で静的ですか? – Vanwaril

+0

静的インデックスです。ブロック内のすべてのスレッドで同じですが、次のブロックごとに少し異なります。ブロック0のようなものは、インデックス(744-1000)&(1000-1256)、ブロック1(488-744)&(1000-1256)などのデータを扱っています。 – Hlavson

関連する問題