设备内存阵列的寿命

时间:2019-01-25 17:25:57

标签: python cuda gpgpu numba

我有一个用numba-cuda编写的cuda内核,该内核可以处理无法立即容纳在GPU内存中的大型阵列。因此,我必须多次调用内核来处理整个阵列。在循环中调用内核,在循环中,在GPU完成计算之后,我将结果复制并聚合回主机阵列。

我的问题:

  • 设备阵列和复制到GPU内存的阵列的寿命是多少?从一个内核调用另一个内核就可以保留它们的价值吗?
  • 我是否需要将设备数组定义放入循环内(在调用内核之前),还是在进入循环之前只做一次?
  • 我是否需要在代码中手动释放/删除设备阵列,否则CUDA内存管理器将在程序结束时执行此操作?

谢谢。

1 个答案:

答案 0 :(得分:1)

  
      
  • 设备阵列和复制到GPU内存的阵列的寿命是多少?从一个内核调用中保留它们的值吗?   另一个?
  •   

在Numba中,全局内存分配会保留到释放为止。

  
      
  • 我是否需要将设备数组定义放入循环内(在调用内核之前),还是在进入内核之前只做一次   环?
  •   

后者。

  
      
  • 我是否需要在代码中手动释放/删除设备阵列,否则CUDA内存管理器将在程序结束时执行该操作?
  •   

首先要意识到的是,您没有想象中的CUDA内存管理器。销毁上下文后,将自动释放内存分配,否则在任何情况下都不会释放。唯一的例外是使用Numba device_array,如果超出范围,Python可能会对其进行垃圾回收。但是,通常,您应该假定分配的任何内容都保留在内存中,直到您明确释放它为止,并且始终在代码中包括明确的内存释放。