5

キーのベクトルがあるとします

thrust::device_vector<int> keys(10); 
keys[0] = 51; // -----> 
keys[1] = 51; 
keys[2] = 72; // -----> 
keys[3] = 72; 
keys[4] = 72; 
keys[5] = 103; //-----> 
keys[6] = 103; 
keys[7] = 504; // ------> 
keys[8] = 504 
keys[9] = 504 ; 

4このベクトルには個別のキー値があることを事前に知っています。2 つのデバイス配列 pidx[4]pnum[4].

  1. このpidx配列は、キー ベクトル内の個別の各キーの最初の位置、つまり---->上記のコード スニペットで でマークされた位置を示します。したがって、この例では、pidx[4] = {0, 2, 5, 7}.

  2. このpnum配列は、各キーの出現回数を示しています。したがって、この例では、 pnum[4] = {2, 3, 2, 3}.

上記の操作を CUDA Thrust でどのように実行しますか?

4

4 に答える 4

2

これは最適な解決策ではありませんが、より良い方法がわかりません。

// Use `unique` to grab the distinct values
thrust::device_vector<int> values(4);
thrust::unique_copy( keys.begin(), keys.end(), values.begin() );

// For each of the values use `count` to get the frequencies
for ( int i = 4; i != 0; --i )
    pnum[i] = thrust::count( keys.begin(), keys.end(), values[i] );

// Use prefix sum to get the indices
thrust::exclusive_scan( pnum.begin(), pnum.end(), pidx.begin() );
于 2012-01-10T12:35:30.093 に答える
1

このソリューションは、キーのリストが既にソートされていることを前提としています。そうでない場合は、最初に別のステップを追加して、リストを並べ替えます。

// generate a list of indices to correspond with the key array
thrust::device_vector<int> values(numKeys);
thrust::sequence(values.begin(), values.end());

// perform an inclusive scan to determine the minimum index for each unique key
thrust::equal_to<int> binaryPred;
thrust::minimum<int> binaryOp;
thrust::inclusive_scan_by_key(keys.begin(), keys.end(), values.begin(), values.begin(), binaryPred, binaryOp);

// find the unique indices
thrust::unique(values.begin(), values.end());
于 2012-07-22T20:05:29.027 に答える
0

別の解決策として、Arrayfire ライブラリを試すことができます。その種の問題のための特別な機能があります。

   float keys[] = {51,51,72,72,72,103,103,504,504,504};      
   int N = sizeof(keys) / sizeof(int);

   array input(N, 1, keys);
   array values, pidx, locations;
   // unique elements in a vector and their indicies 
   setunique(values, pidx, locations, input);

   // # of unique elements
   int n_unique = pidx.elements();
   array pnum = zeros(n_unique); // empty array

   gfor(array i, n_unique) // parallel for loop
      // count the # of occurrences for each key
      pnum(i) = sum(locations == i);

   print(pidx);           
   print(pnum);

出力:

pidx = 0.0000 2.0000 5.0000 7.0000

pnum = 2.0000 3.0000 2.0000 3.0000

于 2012-07-24T08:29:10.743 に答える