c – 为具有增加的维度(点数)的点云分配CUDA设备内存

我正在写一个我需要的程序:

>对图像的每个像素进行测试
>如果测试结果为TRUE,我必须向点云添加一个点
>如果测试结果为FALSE,则不做任何事

我已经在CPU端C编写了一个工作代码.
现在我需要使用CUDA来加速它.我的想法是制作一些块/线程(我猜每个像素一个线程)并行执行测试,如果测试结果为TRUE,则让线程向云添加一个点.

这就是我的麻烦:如果我不知道我将在云中插入的点的数量,我如何为Point云(使用cudaMalloc或类似物)分配设备内存空间?

我是否必须分配固定数量的内存,然后每当点云达到限制维度时增加它?或者有“动态”分配内存的方法吗?

最佳答案 当您在设备上分配内存时,您可以使用两个API调用来执行此操作:一个是Taro所描述的malloc,但它受某些内部驱动程序限制(默认为8 MB)的限制,可以通过设置适当的增加来增加使用参数cudaLimitMallocHeapSize限制为
cudaDeviceSetLimit.

或者,您可以在内核中使用cudaMalloc,因为它既是主机又是设备API方法.

在这两种情况下,Taro的观察结果都表明:您将分配一个新的不同缓冲区,就像在CPU上一样.因此,使用单个缓冲区可能导致需要数据副本.请注意,cudaMemcpy不是设备API方法,因此,您可能需要编写自己的方法.

据我所知,CUDA API中没有realloc这样的东西.

回到最初的问题,您可能希望分三个阶段实现算法:第一阶段将计算您需要的样本数量,第二阶段将分配数据阵列,第三阶段将数据阵列提供给第三阶段.要实现这一点,您可以使用原子函数来增加一些计算样本数的int.

点赞