如何在for循环中重新分配cuda gpu设备阵列而不耗尽内存?

时间:2019-09-16 23:05:04

标签: python cuda gpu numba

查看以下代码:

dev --local .

成功运行

 (cudavenv) C:\main\FemtoTest\Library\Python\libImageProcess\trunk\src\libImageProcess>python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> from numba import cuda
>>> for i in range(26):
...     arr = np.zeros((17, 8025472),dtype=np.uint32)
...     d_arr = cuda.to_device(arr)
...

我认为首先是每次将d_arr重新分配给设备阵列,因此它仅占用那么多内存。在第二种情况下,因为有26个实例,所以每次都会在设备上创建一个新阵列,并最终耗尽内存。在for循环中使用完内存引用后,需要调用哪种方法删除内存引用?这样就可以毫无问题地运行?

1 个答案:

答案 0 :(得分:2)

您可能希望阅读第3.3.8 here节。

当最后一个对它的引用被删除时,不再需要的CUDA内存可能会被解除分配。在您的第一种情况下,这种情况发生在重新分配d_arr的每次循环中。在第二种情况下则没有,因为引用保存在ms中。

我认为适当的解决方案是使引用被删除。 The pythonic way to do this是要删除引用:

import numpy as np
from numba import cuda
class M:
    def __init__(self):
            self.arr = np.zeros((17, 8025472),dtype=np.uint32)
            self.d_arr = None

ms = [M() for _ in range(26)]
for m in ms:
    m.d_arr = cuda.to_device(m.arr)
    # do whatever it is you want to do with m.d_arr here
    m.d_arr = None