Как управляется память CUDA?

Когда я запускаю свою программу CUDA, которая выделяет лишь небольшой объем глобальной памяти (менее 20 М), я получаю ошибку "out of memory". (Из сообщений других людей я думаю, что проблема связана с фрагментацией памяти) Я пытаюсь понять эту проблему, и понимаю, что у меня есть пара вопросов, связанных с управлением памятью CUDA.

  1. Существует ли в CUDA концепция виртуальной памяти?

  2. Если на CUDA одновременно может работать только одно ядро, то после его завершения освободится ли вся использованная или выделенная им память? Если нет, то когда эта память освободится?

  3. Если более чем одному ядру разрешено работать на CUDA, как они могут убедиться, что используемая ими память не перекрывается?

Может ли кто-нибудь помочь мне ответить на эти вопросы? Спасибо

Правка 1: операционная система: x86_64 GNU/Linux Версия CUDA: 4.0 Устройство: Geforce 200, Это один из GPUS, подключенных к машине, и я не думаю, что это устройство отображения.

Edit 2: Ниже приведено то, что я получил после проведения некоторых исследований. Не стесняйтесь меня поправить.

  1. CUDA будет создавать один контекст для каждого потока хоста. Этот контекст будет хранить информацию о том, какая часть памяти (предварительно выделенная память или динамически выделенная память) была зарезервирована для данного приложения, чтобы другие приложения не могли записывать в нее данные. Когда данное приложение завершается (не ядро), эта часть памяти освобождается.

  2. Память CUDA поддерживается списком ссылок. Когда приложению нужно выделить память, оно просматривает этот список ссылок, чтобы узнать, есть ли в нем непрерывный участок памяти, доступный для выделения. Если такой участок не найден, пользователю будет выдана ошибка "out of memory", даже если общий объем доступной памяти больше, чем запрашиваемая память. Это и есть проблема, связанная с фрагментацией памяти.

  3. cuMemGetInfo скажет вам, сколько памяти свободно, но не обязательно, сколько памяти вы можете выделить при максимальном распределении из-за фрагментации памяти.

  4. На платформе Vista (WDDM) возможна виртуализация памяти GPU. То есть, несколько приложений могут выделить почти всю память GPU, а WDDM будет управлять свопингом данных обратно в основную память.

Новые вопросы: 1. Если память, зарезервированная в контексте, будет полностью освобождена после завершения работы приложения, то фрагментация памяти не должна существовать. В памяти должны остаться какие-то данные. 2. Есть ли способ реструктурировать память GPU ?

24
задан talonmies 15 January 2016 в 06:05
поделиться