在cuda内核函数中,没有自动垃圾回收。在Cuda中,临时设备指针的更好做法是什么?重用固定设备指针,或创建并释放设备指针?
例如,要为两个向量之间的平方误差之和编写Cuda内核函数,有一个临时设备指针用于存储两个向量的差异然后求和这个临时设备指针的元素的平方更方便。一个选项是分配一个临时设备指针,然后为每个函数调用释放它,另一个选项是有一个不断重用的临时设备指针。
这两个选项之间有什么更好的做法?
答案 0 :(得分:1)
如果你可以使用cudaMalloc和cudaFree并避免多次分配,你应该避免在内核中使用动态内存分配,因为它会有额外的性能成本,而且大小有限,具体取决于启动配置:
以下API函数获取并设置堆大小:
cudaDeviceGetLimit(size_t* size, cudaLimitMallocHeapSize) cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)
授予的堆大小至少为size个字节。 cuCtxGetLimit()和 cudaDeviceGetLimit()返回当前请求的堆大小。
当模块出现时,会发生堆的实际内存分配 通过CUDA驱动程序API显式加载到上下文中 (参见模块),或隐式通过CUDA运行时API(参见CUDA C. 运行时)。
请参阅CUDA文档中的Dynamic global memory allocation。