我正在写一个我需要的程序:
>对图像的每个像素进行测试
>如果测试结果为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.