首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随着维数的增加,为点云分配CUDA设备内存

随着维数的增加,为点云分配CUDA设备内存
EN

Stack Overflow用户
提问于 2016-04-22 09:59:39
回答 2查看 263关注 0票数 4

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

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-04-22 10:25:19

我想把这作为一个评论,因为它只是部分回答,但它太长,这一点。

是的,您可以从内核动态分配内存。您可以在内核中调用malloc()和free()来动态分配和释放计算期间的内存,如解释的在数据自动化系统7.5编程指南的B-16部分

代码语言:javascript
复制
__global__ void mallocTest()
{
    size_t size = 123;
    char* ptr = (char*)malloc(size);
    memset(ptr, 0, size);
    printf("Thread %d got pointer: %p\n", threadIdx.x, ptr);
    free(ptr);
}

int main()
{
    // Set a heap size of 128 megabytes. Note that this must
    // be done before any kernel is launched.
    cudaDeviceSetLimit(cudaLimitMallocHeapSize, 128*1024*1024);
    mallocTest<<<1, 5>>>();
    cudaDeviceSynchronize();
    return 0;
}

(您需要2.x或更高的计算能力)

--但是通过这样做,您可以在内存中分配一个新的和不同的缓冲区,而不会像CPU动态容器(向量、列表等)那样使以前由主机缓冲区分配的缓冲区“增长”。

我认为您应该设置一个常量,设置数组的最大大小,然后分配最大大小,并使内核在这个最大缓冲区中增加“实际使用的大小”。如果这样做,不要忘记使这个增量是原子/同步的,以计数来自每个并发线程的每个增量。

票数 1
EN

Stack Overflow用户

发布于 2016-04-22 11:45:27

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

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

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

据我所知,在数据自动化API中没有像雷洛克这样的东西。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36790702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档