在我的程序中,我通过体素网格跟踪大量粒子。粒子与体素的比率是任意的。在某个时刻,我需要知道哪些粒子在哪些体素中,以及有多少粒子在哪些粒子中。具体而言,体素必须确切地知道其中包含哪些粒子。由于我不能在CUDA中使用std::vector
之类的东西,我使用以下算法(在高级别):
虽然这打破了第二步。我没有在CUDA中编程很长时间,并且发现线程之间同时写入全局内存中相同位置会产生不确定的结果。这反映在这样一个事实,即我大多数在buckets
得到1,偶尔有2.这是我在这一步使用的代码的草图:
__global__ void GPU_AssignParticles(Particle* particles, Voxel* voxels, int* buckets) {
int tid = threadIdx.x + blockIdx.x*blockDim.x;
if(tid < num_particles) { // <-- you can assume I actually passed this to the function :)
// Some math to determine the index of the voxel which this particle
// resides in.
buckets[index] += 1;
}
}
我的问题是,在CUDA中生成这些计数的正确方法是什么?
另外,有没有办法存储体素内的粒子参考?我看到的问题是体素内的粒子数量不断变化,因此几乎每一帧都必须重新分配新阵列并重新分配。
答案 0 :(得分:1)
虽然可能有更有效的解决方案来计算铲斗数量,但第一个可行的解决方案是使用您当前的方法,但使用原子增量。这样,一次只有一个线程以原子方式递增桶数(在整个网格上同步):
if(tid < num_particles) {
// ...
atomicAdd(&buckets[index], 1);
}