首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放Pycuda的内存

释放Pycuda的内存
EN

Stack Overflow用户
提问于 2021-12-13 09:22:33
回答 1查看 663关注 0票数 2

如何在Pycuda函数调用之后释放内存?

例如,在下面,我如何释放a_gpu使用的内存,这样我就有足够的内存分配给b_gpu,而不是像下面这样出现错误。

我尝试导入from pycuda.tools import PooledDeviceAllocationimport pycuda.tools.PooledDeviceAllocation,希望使用ImportError: cannot import name 'PooledDeviceAllocation' from 'pycuda.tools' (D:\ProgramData\Anaconda3\lib\site-packages\pycuda\tools.py) ()函数,但它们在导入ImportError: cannot import name 'PooledDeviceAllocation' from 'pycuda.tools' (D:\ProgramData\Anaconda3\lib\site-packages\pycuda\tools.py)ModuleNotFoundError: No module named 'pycuda.tools.PooledDeviceAllocation'; 'pycuda.tools' is not a package时都会导致错误。如果它应该在较新版本的Pycuda上工作,但只是我的Pycuda版本太老了,那么在我的版本或旧版本的Pycuda中是否还有其他方法来释放内存呢?我希望Pycuda的升级是最后的手段,因为我的NVidia卡是老到2060年系列,以防新版本的Pycuda不支持我的旧卡。

提前谢谢。

代码语言:javascript
复制
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import os

_path = r"D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64"

if os.system("cl.exe"):
   os.environ['PATH'] += ';' + _path
if os.system("cl.exe"):
   raise RuntimeError("cl.exe still not found, path probably incorrect")

import numpy as np

a = np.zeros(1000000000).astype(np.float32)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)

mod = SourceModule("""
  __global__ void func1(float *a)
  {
    a[0] = 1;
  }
  """)
      
func = mod.get_function("func1")
func(a_gpu, block=(1,1,1))

a_out = np.empty_like(a)
cuda.memcpy_dtoh(a_out, a_gpu)
print (a_out)

# Memory release code wanted here

b = np.zeros(1000000000).astype(np.float32)
b_gpu = cuda.mem_alloc(b.nbytes)
cuda.memcpy_htod(b_gpu, b)

mod = SourceModule("""
  __global__ void func2(float *b)
  {
    b[1] = 1;
  }
  """)
      
func = mod.get_function("func2")
func(b_gpu, block=(1,1,1))

b_out = np.empty_like(b)
cuda.memcpy_dtoh(b_out, b_gpu)
print (b_out)
代码语言:javascript
复制
[1. 0. 0. ... 0. 0. 0.]
Traceback (most recent call last):

  File "D:\PythonProjects\Test\CUDA\Test_PyCUDA_MemoryRelease.py", line 47, in <module>
    b_gpu = cuda.mem_alloc(b.nbytes)

MemoryError: cuMemAlloc failed: out of memory
EN

回答 1

Stack Overflow用户

发布于 2021-12-13 09:39:50

尝试将free()应用于DeviceAllocation对象(在本例中为a_gpu)

代码语言:javascript
复制
import pycuda.driver as cuda

a = np.zeros(1000000000).astype(np.float32)
a_gpu = cuda.mem_alloc(a.nbytes)
a_gpu.free()

来自文档

free()现在释放所持有的设备内存,而不是当该对象无法到达时释放。对象的任何进一步使用都是一个错误,将导致未定义的行为。

检查:

代码语言:javascript
复制
cuda.mem_get_info()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70332345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档