gpt4 book ai didi

c++ - 为维数增加(点数)的点云分配 CUDA 设备内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:26 26 4
gpt4 key购买 nike

我正在编写一个程序,我需要:

  • 对图像的每个像素进行测试
  • 如果测试结果为真,我必须向点云中添加一个点
  • 如果测试结果为假,什么都不做

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

我的麻烦来了:如果我事先不知道要插入到点云中的点数,我如何在设备内存中为点云分配空间(使用 cudaMalloc 或类似工具)?

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

最佳答案

当你在设备上分配内存时,你可以通过两个 API 调用来实现:一个是 Taro 描述的 malloc,但它受到一些内部驱动程序限制(默认 8 MB)的限制,可以增加使用带有参数 cudaLimitMallocHeapSize 的 cudaDeviceSetLimit 设置适当的限制。

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

在这两种情况下,Taro 的观察都是成立的:您将分配一个新的不同缓冲区,就像在 CPU 上所做的那样。因此,使用单个缓冲区可能会导致需要一份数据拷贝。请注意,cudaMemcpy 不是设备 API 方法,因此,您可能需要编写自己的方法。

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

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

关于c++ - 为维数增加(点数)的点云分配 CUDA 设备内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36790702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com