Подтвердить что ты не робот

Память с нулевым копированием по умолчанию

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

  • Данные не вписываются в память GPU

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

Скопированная, но не отображаемая память лучше:

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

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

Ответ 2

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

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

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

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

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