Прикрепленная по умолчанию память против памяти с нулевым копированием - PullRequest
33 голосов
/ 06 марта 2011

В CUDA мы можем использовать закрепленную память для более эффективного копирования данных с хоста на графический процессор, чем память по умолчанию, выделенная через malloc на хосте. Однако существует два типа закрепленных запоминающих устройств: закрепленное запоминающее устройство по умолчанию и закрепленное запоминающее устройство с нулевой копией .

По умолчанию закрепленная память копирует данные с хоста на графический процессор в два раза быстрее, чем обычные передачи, поэтому, безусловно, есть преимущество (при условии, что у нас достаточно памяти хоста для блокировки страницы)

В другой версии закрепленной памяти, то есть память с нулевым копированием , нам не нужно полностью копировать данные с хоста в DRAM GPU. Ядра считывают данные непосредственно из памяти хоста.

У меня вопрос: какой из этих типов закрепленной памяти является лучшей практикой программирования.

Ответы [ 2 ]

32 голосов
/ 06 марта 2011

Я думаю, что это зависит от вашего приложения (в противном случае, почему они предоставляют оба способа?)

Отображенная, закрепленная память (нулевое копирование) полезна, когда:

  • Графический процессор не имеет отдельной памяти и все равно использует оперативную память

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

  • Сторона хоста хочет изменить / добавить больше данных или прочитать результаты, пока ядро ​​все еще работает (например, связь)

  • Данные не помещаются в память графического процессора

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

Закрепленная, но не сопоставленная память лучше:

  • Когда вы загружаете или сохраняете данные несколько раз. Например: у вас есть несколько последующих ядер, выполняющих работу поэтапно - нет необходимости каждый раз загружать данные с хоста.

  • Не так много вычислений для выполнения, и задержки загрузки не будут хорошо скрыты

12 голосов
/ 01 мая 2011

Отображаемая закрепленная память идентична другим типам закрепленной памяти во всех отношениях, за исключением того, что она отображается в адресное пространство CUDA, поэтому может считываться и записываться ядрами CUDA, а также использоваться для передачи DMA с помощью двигателей копирования.

Преимущество отсутствия отображения закрепленной памяти было двояким: оно сэкономило вам некоторое адресное пространство, которое может стать ценным товаром в мире 32-разрядных платформ с графическими процессорами, которые могут вместить 3-4 ГБ ОЗУ.Кроме того, не отображаемая память не может быть случайно повреждена мошенническими ядрами.Но эта проблема настолько эзотерична, что функция унифицированного адресного пространства в CUDA 4.0 приведет к тому, что все закрепленные распределения будут отображаться по умолчанию.

Помимо вопросов, затронутых в книге Сандерса / Кандрот, следует учитывать и другие вещи:

  • запись в память хоста из ядра (например, для отправки результатов в ЦП) хороша тем, что в этом случае GPU не имеет задержки для покрытия, и

  • ОЧЕНЬ ВАЖНО, чтобы операции с памятью были объединены - в противном случае даже графические процессоры SM 2.x и более поздних версий имеют большой удар по пропускной способности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...