1

重複の可能性:
cuda 配列内の数値の出現回数のカウント

配列内の重複の発生をカウントするために推力または cuda を使用する方法はありますか?

たとえば、デバイス ベクトル { 11, 11, 9, 1, 3, 11, 1, 2, 9, 1, 11} がある場合、 1 :3 2:1 3:1 9:2, 11:4 を取得する必要があります

スラストがそれを行うことができない場合、どうすればカーネルを使用してそれを行うことができますか?

ありがとう!濃度計算をしています。それが私がこの質問をしている理由です。nx X ny X nz セルを持つドメインに 100000 個の粒子があると仮定すると、各セルの濃度 (各セルにいくつの粒子があるか) を計算する必要があります。

私のカーネルはこれです

__global__ void concentration_kernel(float3* posPtr, uint* device_cons) 
{
    __shared__ uint cache[256];
    uint x = threadIdx.x + blockIdx.x * blockDim.x;
    uint y = threadIdx.y + blockIdx.y * blockDim.y;
    uint offset = x + y * blockDim.x * gridDim.x; 

    float3 posf3 = posPtr[offset];//make_float3(43.5,55,0.66);//
    uint cellIndex = (uint)(posf3.z+1)*153*110 + (uint)(posf3.y)*153 + (uint)posf3.x;

    cache[threadIdx.x] = device_cons[cellIndex];
    __syncthreads();
    uint a = cache[threadIdx.x];
    a++;
    cache[threadIdx.x] = a;
    __syncthreads();

    device_cons[cellIndex] = cache[threadIdx.x]; 
}
4

2 に答える 2

2

最初に Thrust::sort を使用してベクトルをソートし、次にThrust::reduce_by_keyを使用できます。ただし、ソート後に 1 の (およびソートされたベクトルと同じ長さの) 新しいベクトル (値と呼ばれる) を作成する必要もあります。これらの値を合計してカウントを取得します。

reduce_by_key is a generalization of reduce to key-value pairs. 
For each group of consecutive keys in the range [keys_first, keys_last) 
that are equal, reduce_by_key copies the first element of the group to 
the keys_output. The corresponding values in the range are reduced using 
the plus and the result copied to values_output.
于 2012-07-19T04:29:02.440 に答える
1

thrust::uniqueとの組み合わせを使用して、thrust::binary_search重複を見つけることができます。このアプローチを使用してその場で実行することはできませんが、スラスト コードを使用するだけで実行できます。

于 2012-07-19T14:16:01.853 に答える