CuPy random - 如何在同一内存中生成新的随机集?

CuPy random - how to generate new random set in same memory?

我正在生成大量随机数,总计超过 GPU 可用内存的一半。我正在循环执行此操作。

当我第二次(或第三次...)调用 cupy.random 时,分配给相同的变量名,它不会释放第一个数组的内存。它尝试分配更多内存,这会导致内存不足错误。

在生成新的随机数组之前显式释放内存非常慢,而且效率似乎很低。

有没有办法生成一组新的数字,但在同一个内存中space?

编辑:cupy.random.shuffle() 让我解决了这个问题,但我想知道是否有更好的方法?

编辑 2:经过进一步审查,shuffle() 没有解决问题,而且似乎需要比分配第二个内存块(在释放第一个内存块之前)更多的内存...我回到限制 ndarray大小小于剩余内存的一半,因此可以交替分配两个 ndarray

正如 user2357112 所建议的,cupy.random.random() 似乎不支持“re-randomizing”现有的 ndarray,即使 cuRand 支持。编写 C 来修改现有的 cupy 数组在某种程度上破坏了首先使用 python / cupy 的意义。

奇怪的是,拥有大约 1/3 可用内存大小的数组,同时增加循环次数,总执行时间更快(与更大的 arrays/fewer 循环相比)。我无法确定 cupy(或 python 或 cuda?)何时对废弃数组进行垃圾回收,但它似乎是异步发生的。

如果 GPU 垃圾收集使用 cuda 内核(我想是这样?),它似乎不会对我的代码执行时间产生实质性影响。 Nvidia-smi 当我的代码计算为 运行 时报告“P2”GPU 使用情况,这表明仍有内核可用于 cupy / cuda 以释放我的代码之外的内存?

我不喜欢回答我自己的问题...只是分享我的发现以防对其他人有所帮助