CuPy random - как сгенерировать новый случайный набор в той же памяти?

Я генерирую большой массив случайных чисел, что составляет более половины доступной памяти на графическом процессоре. Я делаю это в цикле.

Когда я вызываю cupy.random второй раз (или в третий раз ...), присваивая одно и то же имя переменной, он не освобождает память для первого массива. Он пытается выделить больше памяти, что вызывает ошибку нехватки памяти.

Явное освобождение памяти перед генерацией нового случайного массива происходит очень медленно и кажется неэффективным.

Есть ли способ сгенерировать новый набор чисел, но в том же пространстве памяти?

Изменить: cupy.random.shuffle () позволяет мне обойти проблему, но мне интересно, есть ли способ лучше?

Изменить 2: при дальнейшем рассмотрении shuffle () не решает проблему и, похоже, требует даже больше памяти, чем выделение второго блока (перед освобождением первого) памяти ... Я вернулся к ограничению размера ndarray до менее половины оставшаяся память, поэтому два массива ndarrays могут быть выделены поочередно


person Stripedbass    schedule 12.08.2020    source источник
comment
В документации не упоминается параметр out или что-либо подобное, поэтому не похоже, что то, что вы хотите, возможно.   -  person user2357112 supports Monica    schedule 13.08.2020


Ответы (1)


Как предлагает user2357112, cupy.random.random (), похоже, не поддерживает «повторную рандомизацию» существующего ndarray, хотя cuRand поддерживает. Написание C для изменения существующего массива cupy в первую очередь лишает смысла использование python / cupy.

Любопытно, что наличие массива размером примерно 1/3 доступной памяти при увеличении количества циклов быстрее по общему времени выполнения (по сравнению с большими массивами / меньшим количеством циклов). Мне не удалось определить, когда cupy (или python или cuda?) Выполняет сборку мусора в неиспользуемом массиве, но, похоже, это происходит асинхронно.

Если для сборки мусора GPU используются ядра cuda (я полагаю, что это так?), Это не оказывает существенного влияния на время выполнения моего кода. Nvidia-smi сообщает об использовании графического процессора «P2», когда выполняются вычисления моего кода, предполагая, что для cupy / cuda все еще доступны ядра для освобождения памяти вне моего кода?

Я не люблю отвечать на свой вопрос ... просто делюсь тем, что нашел, на случай, если это поможет кому-то другому

person Stripedbass    schedule 16.08.2020