こんにちは、バイトを比較する必要があるカーネル関数があります。検索したい領域はブロックに分割されているので、4kバイトの配列は4k/256 = 16ブロックに分割されます。ブロック内の各スレッドは、idx の配列を読み取り、それを別の配列と比較します。検索対象はどこですか。私はこれを2つの方法で行いました:
1.グローバルメモリ内のデータを比較しますが、多くの場合、ブロック内のスレッドは同じアドレスを読み取る必要があります.
2. グローバル メモリから共有メモリにデータをコピーし、上記と同じ方法で共有メモリのバイトを比較します。同じアドレスの読み取りにまだ問題があります。共有メモリへのコピーは次のようになります。
myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];
コードの残りの部分は同じです。共有配列では、例 2 のデータに対する操作のみが実行されます。
しかし、最初のオプションは、共有メモリを使用する場合よりも約 10% 高速です。なぜですか?? 説明ありがとうございます。