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

  • 本文关键字:指针 释放 创建 更好 是什么 cuda 对于 cuda
  • 更新时间 :
  • 英文 :


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

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

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

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

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

cudaDeviceGetLimit(size_t* size, cudaLimitMallocHeapSize)
cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t size)

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

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

请参阅 CUDA 文档中的动态全局内存分配。

最新更新