加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在CUDA线程中填充计数’桶’

发布时间:2020-12-16 06:59:34 所属栏目:百科 来源:网络整理
导读:在我的程序中,我通过体素网格跟踪大量粒子.粒子与体素的比率是任意的.在某个时刻,我需要知道哪些粒子在哪些体素中,以及有多少粒子在哪些粒子中.具体而言,体素必须确切地知道其中包含哪些粒子.因为我不能在CUDA中使用像std :: vector这样的东西,所以我使用以
在我的程序中,我通过体素网格跟踪大量粒子.粒子与体素的比率是任意的.在某个时刻,我需要知道哪些粒子在哪些体素中,以及有多少粒子在哪些粒子中.具体而言,体素必须确切地知道其中包含哪些粒子.因为我不能在CUDA中使用像std :: vector这样的东西,所以我使用以下算法(在高级别):

>分配体素数量大小的整数数组
>为所有粒子启动线程,确定每个粒子所在的体素,并在我的“桶”阵列中增加适当的计数器
>分配粒子数量大小的指针数组
>计算每个体素在此新阵列中的偏移量(将前面体素中的粒子数相加)
>以有序的方式将粒子放置在阵列中(我使用此数据来加速以后的操作.速度增加非常值得增加内存使用量).

这打破了第二步.我没有在CUDA中编程很长时间,并且发现线程之间同时写入全局内存中相同位置会产生不确定的结果.这反映在这样一个事实,即我大多数在桶中得到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中生成这些计数的正确方法是什么?

另外,有没有办法存储体素内的粒子参考?我看到的问题是体素内的粒子数量不断变化,因此几乎每一帧都必须重新分配新阵列并重新分配.

解决方法

虽然可能有更有效的计算铲斗数量的解决方案,但第一个工作解决方案是使用您当前的方法,但使用原子增量.这样,一次只有一个线程以原子方式递增桶数(在整个网格上同步):

if(tid < num_particles) {
    // ...
    atomicAdd(&buckets[index],1);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读