我正在写一个程序,我需要:
我已经在CPU端C++上编写了一个工作代码。现在我需要用CUDA加快速度。我的想法是让一些块/线程(我猜每个像素一个线程)并行执行测试,如果测试结果是真的,让线程向云中添加一个点。
我的麻烦来了:,如果我事先不知道要在云中插入的点的数量,如何在设备内存中为点云分配空间(使用cudaMalloc或类似的)?
我是否必须分配一个固定数量的内存,然后每次点云达到极限时增加它?还是有一种“动态”分配内存的方法?
发布于 2016-04-22 10:25:19
我想把这作为一个评论,因为它只是部分回答,但它太长,这一点。
是的,您可以从内核动态分配内存。您可以在内核中调用malloc()和free()来动态分配和释放计算期间的内存,如解释的在数据自动化系统7.5编程指南的B-16部分:
__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动态容器(向量、列表等)那样使以前由主机缓冲区分配的缓冲区“增长”。
我认为您应该设置一个常量,设置数组的最大大小,然后分配最大大小,并使内核在这个最大缓冲区中增加“实际使用的大小”。如果这样做,不要忘记使这个增量是原子/同步的,以计数来自每个并发线程的每个增量。
发布于 2016-04-22 11:45:27
当您在设备上分配内存时,可以使用两个API调用:一个是Taro描述的malloc,但它受一些内部驱动程序限制(默认情况下是8MB),可以通过使用参数cudaDeviceSetLimit设置适当的cudaLimitMallocHeapSize限制来增加。
或者,您可以在内核中使用cudaMalloc,因为它既是主机又是设备API方法。
在这两种情况下,Taro的观察都成立:您将分配一个新的不同的缓冲区,就像它在CPU上所做的那样。因此,使用单个缓冲区可能导致需要数据副本。请注意,cudaMemcpy不是一个设备API方法,因此,您可能需要编写自己的。
据我所知,在数据自动化API中没有像雷洛克这样的东西。
回到最初的问题,您可能想要分三个阶段实现算法:第一阶段将计算所需的样本数,第二阶段将分配数据数组,第三阶段将向数据数组提供数据。要实现这一点,您可以使用原子函数来增加计算样本数量的int值。
https://stackoverflow.com/questions/36790702
复制相似问题