3

こんにちは、バイトを比較する必要があるカーネル関数があります。検索したい領域はブロックに分割されているので、4kバイトの配列は4k/256 = 16ブロックに分割されます。ブロック内の各スレッドは、idx の配列を読み取り、それを別の配列と比較します。検索対象はどこですか。私はこれを2つの方法で行いました:

1.グローバルメモリ内のデータを比較しますが、多くの場合、ブロック内のスレッドは同じアドレスを読み取る必要があります.

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

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

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

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

4

2 に答える 2

12

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

したがって、重要な点は、共有メモリの使用は、同じデータに複数回アクセスする必要がある場合 (同じスレッドから、または同じブロック内の異なるスレッドから) にのみ役立つということです。

于 2012-04-20T18:18:40.330 に答える
1

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

投稿したコードから何をしているのか正確にはわかりませんが、global共有メモリを使用する場合、ブロック内のすべてのスレッドで集計された読み取りおよび書き込みの回数が大幅に少なくなるようにする必要があります。 . そうしないと、パフォーマンスの向上は見られません。

于 2012-04-20T18:32:42.223 に答える