Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 填充计数';桶';在CUDA线程中_C++_Algorithm_Cuda - Fatal编程技术网

C++ 填充计数';桶';在CUDA线程中

C++ 填充计数';桶';在CUDA线程中,c++,algorithm,cuda,C++,Algorithm,Cuda,在我的程序中,我通过体素网格跟踪大量粒子。粒子与体素的比率是任意的。在某一点上,我需要知道哪些粒子位于哪些体素中,以及有多少粒子位于其中。具体地说,体素必须准确地知道其中包含哪些粒子。因为我不能在CUDA中使用类似于std::vector的任何东西,所以我使用以下算法(在高层): 分配一个整数数组,其大小等于体素的数量 为所有粒子启动线程,确定每个粒子所在的体素,并在“bucket”数组中增加相应的计数器 分配粒子数大小的指针数组 计算每个体素在此新阵列中的偏移(将其前面的体素中的粒子数相加)

在我的程序中,我通过体素网格跟踪大量粒子。粒子与体素的比率是任意的。在某一点上,我需要知道哪些粒子位于哪些体素中,以及有多少粒子位于其中。具体地说,体素必须准确地知道其中包含哪些粒子。因为我不能在CUDA中使用类似于
std::vector
的任何东西,所以我使用以下算法(在高层):

  • 分配一个整数数组,其大小等于体素的数量
  • 为所有粒子启动线程,确定每个粒子所在的体素,并在“bucket”数组中增加相应的计数器
  • 分配粒子数大小的指针数组
  • 计算每个体素在此新阵列中的偏移(将其前面的体素中的粒子数相加)
  • 以有序的方式将粒子放置在阵列中(稍后我使用这些数据来加速操作。速度的提高非常值得内存使用的增加)
不过,这在第二步就失败了。我已经很久没有在CUDA中编程了,只是发现线程之间同时写入全局内存中的同一位置会产生未定义的结果。这反映在这样一个事实上,我在
bucket
中的得分大多为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;
    }
}
\uuuu全局\uuuu无效GPU\u指定粒子(粒子*粒子,体素*体素,整数*桶){
int tid=threadIdx.x+blockIdx.x*blockDim.x;

如果(tid
if(tid
您可以在CUDA中使用
推力::向量
。是否可以将
推力::向量
作为结构的成员,并在CUDA内核中对其进行操作?不管怎样,只是在推力文档中发现了这一点。
if(tid < num_particles) {
    // ...
    atomicAdd(&buckets[index], 1);
}