5

以下のようなランダム ウォークの場合(各インデックスは一意ではありません)、ゼロで埋められ iたデバイス ベクトルがあります。A

{0, 1, 0, 2, 3, 3,  ....}

操作が次のようになった後、推力がA[i]自動インクリメントを行うことは可能ですか?A

//2 means appears count of 0's
//1 means appears count of 1's
//1 means appears count of 2's
//2 means appears count of 3's
{2, 1, 1, 2}

私はいくつかのケースを試しましたが、これらのケースAは がホスト ベクトルである場合にのみ正常に機能します。推力は並列に実行されるため、前の結果が新しい結果に影響を与えることができないため、結果は次のように見えるかもしれません。インデックスが何回出現するか {1, 1, 1, 1}

スラストは、デバイス ベクトル A とランダム ウォーク インデックス ベクトルを使用して目標を達成できますか?

4

1 に答える 1

3

Thrust によるヒストグラム計算を探している場合は、2 つの異なるアルゴリズムを提供するThrust ドキュメントの例があることに注意してください。

  1. を使用sortして配列をソートし、次に を使用して累積ヒストグラムupper_boundを決定し、最後に を使用adjacent_differenceしてヒストグラムを計算します。
  2. @Eric のコメントで言及されているようにsort、配列を並べ替えてから を使用してスパース ヒストグラムを使用します。reduce_by_key

この2つのスレッドから

上記は、Thrust を使用してヒストグラムを作成する唯一の 2 つの方法であると言えます。私はケプラー K20c カードで両方のアプローチの時間を測定しましたが、これらはタイミングでした:

  • N=1024*16; # bins= 16*16; 密 = 2.0ms; スパース = 2.4ms;
  • N=1024*128; # bins= 16*128; 密 = 3.4ms; スパース = 3.1ms;

タイミングが入力配列に依存するという事実を考慮すると、結果は劇的に異なるようには見えません。

CUDA サンプルはヒストグラム計算の例を提供しますが、ビン64または256ビン用に最適化されているため、上記の Thrust コードとは一様ではないことに注意してください。

于 2014-03-21T18:49:39.937 に答える