Когда я запускаю свою программу CUDA, которая выделяет только небольшое количество глобальной памяти (ниже 20 М), я получил ошибку "из памяти". (Из сообщений других людей, я думаю, проблема связана с фрагментацией памяти). Я пытаюсь понять эту проблему и понимаю, что у меня есть пара вопросов, связанных с управлением памятью CUDA.
-
Существует ли концепция виртуальной памяти в CUDA?
-
Если разрешено запускать только одно ядро на CUDA одновременно, после его завершения будет выпущена ли вся память, которую он использовал или выделил? Если нет, когда эта память освободилась?
-
Если на CUDA разрешено запускать несколько ядер, как они могут убедиться, что используемая память не перекрывается?
Может ли кто-нибудь помочь мне ответить на эти вопросы? Благодаря
Изменить 1: операционная система: x86_64 GNU/Linux Версия CUDA: 4.0 Устройство: Geforce 200, это один из GPUS, подключенных к аппарату, и я не думаю, что это устройство отображения.
Изменить 2: Ниже приводится то, что я получил после некоторых исследований. Не стесняйтесь меня исправлять.
-
CUDA создаст один контекст для каждого потока хоста. Этот контекст сохранит информацию, такую как часть памяти (предварительно выделенная память или динамически распределенная память), зарезервирована для этого приложения, чтобы другое приложение не могло ее записать. Когда это приложение завершается (не ядро), эта часть памяти будет освобождена.
-
Память CUDA поддерживается списком ссылок. Когда приложение должно выделять память, он перейдет через этот список ссылок, чтобы узнать, есть ли доступный объем памяти для выделения. Если ему не удастся найти такой кусок, ошибка "вне памяти" будет сообщаться пользователям, даже если общий объем доступной памяти больше запрашиваемой памяти. И это проблема, связанная с фрагментацией памяти.
-
cuMemGetInfo расскажет вам, сколько памяти свободна, но не обязательно, сколько памяти вы можете выделить в максимальном распределении из-за фрагментации памяти.
-
На платформе Vista (WDDM) возможна виртуализация памяти GPU. То есть, несколько приложений могут выделять почти всю память GPU, а WDDM будет управлять свопированием данных обратно в основную память.
Новые вопросы: 1. Если память, зарезервированная в контексте, будет полностью освобождена после завершения приложения, фрагментация памяти не должна существовать. Должны быть какие-то данные, оставшиеся в памяти. 2. Есть ли способ реструктурировать память GPU?