问题描述
我正在生成大量随机数,总计超过GPU可用内存的一半。我正在循环执行此操作。
当我第二次(或第三次...)调用cupy.random时,分配给相同的变量名,它不会释放第一个数组的内存。它尝试分配更多的内存,这会导致内存不足错误。
在生成新的随机数组之前显式释放内存非常慢,而且效率似乎很低。
有没有一种方法可以生成一组新的数字,但是要在相同的内存空间中?
编辑:cupy.random.shuffle()让我解决问题,但是我想知道是否有更好的方法?
编辑2:在进一步检查中,shuffle()无法解决问题,并且似乎比分配第二个块(在释放第一个块之前)需要更多的内存...我回到限制ndarray大小为少于剩余内存的一半,因此可以交替分配两个ndarray
解决方法
正如user2357112所建议的,即使cuRand支持,cupy.random.random()似乎也不支持“重新随机化”现有的ndarray。编写C来修改现有的Cupy数组在某种程度上会打败使用python / cupy的意义。
奇怪的是,拥有一个数组大约是可用内存大小的1/3,同时增加了循环数,但总执行时间更快(相对于更大的数组/更少的循环)。我无法确定cupy(或python还是cuda?)何时对废弃的数组进行垃圾回收,但它似乎是异步发生的。
如果GPU垃圾回收使用cuda内核(我想是吗?),它似乎并没有实质性影响我的代码执行时间。 Nvidia-smi在我的代码计算运行时报告“ P2” GPU的使用情况,这表明cupy / cuda仍然有可用的内核来释放我代码之外的内存?
我不喜欢回答自己的问题...只是分享我发现的内容,以防其他人