查看以下代码:
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循环中使用完内存引用后,需要调用哪种方法删除内存引用?这样就可以毫无问题地运行?
答案 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