什么';在cuda中,对于临时设备指针,重用固定设备指针或创建并释放设备指针是更好的做法吗?

什么';在cuda中,对于临时设备指针,重用固定设备指针或创建并释放设备指针是更好的做法吗?,cuda,Cuda,在cuda内核函数中,没有自动垃圾收集。Cuda中临时设备指针的更好实践是什么?重用固定设备指针,还是创建和释放设备指针 例如,要为两个向量之间的误差平方和编写Cuda内核函数,更方便的方法是使用一个临时设备指针来存储两个向量的差,然后将该临时设备指针的元素平方和。一个选项是分配一个临时设备指针,然后为每个函数调用释放它,另一个选项是拥有一个不断重用的临时设备指针 这两个选项之间更好的做法是什么?如果您可以使用cudamaloc和cudaFree并避免多次分配,您应该避免在内核中使用动态内存分配

在cuda内核函数中,没有自动垃圾收集。Cuda中临时设备指针的更好实践是什么?重用固定设备指针,还是创建和释放设备指针

例如,要为两个向量之间的误差平方和编写Cuda内核函数,更方便的方法是使用一个临时设备指针来存储两个向量的差,然后将该临时设备指针的元素平方和。一个选项是分配一个临时设备指针,然后为每个函数调用释放它,另一个选项是拥有一个不断重用的临时设备指针


这两个选项之间更好的做法是什么?

如果您可以使用cudamaloc和cudaFree并避免多次分配,您应该避免在内核中使用动态内存分配,因为它在性能上有额外的成本,并且大小受限于启动配置:

以下API函数获取并设置堆大小:

cudaDeviceGetLimit(size_t* size, cudaLimitMallocHeapSize)
cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)
授予的堆大小将至少为大小字节。cuCtxGetLimit()和 cudaDeviceGetLimit()返回当前请求的堆大小

堆的实际内存分配发生在模块运行时 通过CUDA驱动程序API显式加载到上下文中 (参见模块),或通过CUDA运行时API隐式(参见CUDA C 运行时)


请参阅CUDA文档。

这可能主要是基于意见,但我从性能和缓冲区大小的角度给出了一个答案。对于您的特定示例用例,您不希望存储任何中间结果,因为您的问题已经是内存受限的。您需要的是计算寄存器中的平方差,并根据您的体系结构使用随机、原子和/或共享内存进行缩减。除此之外,运行时分配很少是首选选项。