こんにちは、私はバイトを比較する必要があるカーネル関数を持っています。検索したいエリアはブロックに分割されているので、4kバイトの配列は4k/256 = 16ブロックに分割されます。ブロック内の各スレッドはidxの配列を読み込み、それを別の配列と比較します。ここでは何を検索したいのですか?私はこれを2つの方法で行っています:CUDA共有メモリはグローバルより高速ではありませんか?
1.グローバルメモリ内のデータをコンパイルしますが、ブロック内のスレッドは同じアドレスを読み取る必要があります。
2.グローバルメモリから共有メモリにデータをコピーし、上記と同じ方法で共有メモリのバイトを比較します。同じアドレスを読み取ってもまだ問題があります。共有メモリへ コピーは次のようになります。コードの
myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];
残りは同じです。例2のデータに対する操作のみが共有配列で実行されます。
しかし、最初のオプションは、共有メモリの場合よりも約10%高速です、なぜですか?説明をありがとう。
完全な例を投稿してください。それがなければ、現在の答えのすべてが純粋な推測です。下の回答に対するあなたのコメントは、あなたがしていることを明確にするのに十分ではありません。 – harrism