Время жизни массива памяти устройства - PullRequest
0 голосов
/ 25 января 2019

У меня есть ядро ​​cuda, написанное на numba-cuda, которое обрабатывает большие массивы, которые не помещаются в память GPU сразу. Итак, я должен вызвать ядро ​​несколько раз, чтобы обработать все массивы. Ядро вызывается в цикле, и внутри цикла, после того, как вычисление выполнено на GPU, я копирую и объединяю результаты обратно в массив хоста.

Мои вопросы:

  • Каково время жизни массива устройств и массива, который копируется в память графического процессора? Сохраняются ли их значения от одного вызова ядра к другому?
  • Нужно ли помещать определения массивов устройств в цикл (перед вызовом ядра) или я просто делаю это один раз, прежде чем войти в цикл?
  • Нужно ли мне вручную освобождать / удалять массивы устройств в коде, или менеджер памяти CUDA сделает это в конце программы?

Спасибо.

1 Ответ

0 голосов
/ 26 января 2019
  • Каково время жизни массива устройств и массива, который копируется в память графического процессора?Сохраняются ли их значения от одного вызова ядра к другому?

В Numba глобальные выделения памяти сохраняются до тех пор, пока они не будут освобождены.

  • Do Iнужно поместить определения массивов устройств в цикл (до того, как я вызову ядро), или я просто делаю это один раз, прежде чем войти в цикл?

Последнее.

  • Нужно ли вручную удалять / удалять массивы устройств в коде, или диспетчер памяти CUDA сделает это вконец программы?

Первое, что нужно осознать, это то, что в вашем воображении нет менеджера памяти CUDA.Выделение памяти автоматически освобождается при разрушении контекста, иначе это не происходит ни при каких обстоятельствах.Единственное исключение - если вы используете Numba device_array, который может быть мусором, собранным Python, если он выпадает из области видимости.Но в целом вы должны предполагать, что все, что вы выделяете, остается в памяти до тех пор, пока вы явно не освободите его, и всегда включайте в свой код явное освобождение памяти.

...