0

新しい質問を開始して申し訳ありませんが、集中を行うためにhistogram.cu(推力の例)を使用しようとしましたが、粒子の数が100kを超えると(総当たり)時間がかかります(約5秒かかります)。私がやりたいのは、ドメインの各セルに含まれる粒子の数を計算することですか? セル サイズが 1 X 1 X 1、ドメイン サイズが 100 X 100 X 100 であると仮定すると、50,000 個の粒子の位置が (50, 50, 50)、20,000 個の粒子の位置が (15, 15, 15)、30,000 個の粒子の位置が ( 20、20、20)。したがって、セル (50, 50, 50) には 50k の粒子があり、セル (15, 15, 15) には 20k の粒子があり、セル (20, 20, 20) には 30k の粒子があり、他のセルには粒子はありません

私のコードはこれです posPtr* は粒子の配列であり、device_cons* は各セルの concetration の出力になります。しかし、うまく動かないので、助けてください。 (共有メモリの制御に問題があると思います)

__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]; 
}

ありがとう!

理解を深めるために、ここに私のC ++コードを示します

for(uint i=0; i<numParticles; i++)
{
  float3 posf3 = dev_pos[i]; 
  uint cellIndex = (uint)(posf3.z)*153*110 + 
       (uint)(posf3.y)*153 + (uint)posf3.x; 
  dev_con[cellIndex]++;
}

ドメインのサイズは (152, 110, 30) です。

uint cellIndex = (uint)(posf3.z)*153*110 + 
       (uint)(posf3.y)*153 + (uint)posf3.x;

おかげで粒子のcellindexを取得する

私はそれを理解しました....atomicAdd()を使用してください...

4

0 に答える 0