【问题标题】:Device memory array's life time设备内存阵列的使用寿命
【发布时间】:2019-01-25 17:25:56
【问题描述】:

我有一个用 numba-cuda 编写的 cuda 内核,它可以一次处理不适合 GPU 内存的大型数组。所以,我必须多次调用内核来处理整个数组。内核在循环中被调用,在循环内,GPU 完成计算后,我将结果复制并聚合回主机数组。

我的问题:

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

谢谢。

【问题讨论】:

  • 1) 一个设备数组会在你释放它或结束程序时死掉,如果你不改变它的值,它就不会通过其他一些晦涩的方法改变它的值。 2)如果您可以重写它的值,您可以重用设备指针。 3) 释放分配的代码是一种良好的编程习惯,即使退出程序时它们可能会被释放。

标签: python cuda gpgpu numba


【解决方案1】:
  • 设备数组和复制到 GPU 内存的数组的生命周期是多少?它们的价值是否从一次内核调用中保留下来 另一个?

在 Numba 中,全局内存分配被保留,直到它们被释放。

  • 我需要将设备数组定义放入循环中(在调用内核之前)还是在进入 环形?

后者。

  • 我是否需要在代码中手动释放/删除设备数组,或者 CUDA 内存管理器会在程序结束时执行此操作?

首先要意识到的是,没有你想象中的 CUDA 内存管理器。当上下文被销毁时,内存分配会自动释放,否则在任何情况下都不会。唯一的例外是如果你使用 Numba device_array,如果它超出范围,它可能会被 Python 垃圾收集。但是,一般来说,您应该假设您分配的任何内容都保留在内存中,直到您显式释放它,并且始终在代码中包含显式内存释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多