新しい質問を開始して申し訳ありませんが、集中を行うために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()を使用してください...