Память с нулевым копированием по умолчанию
В CUDA мы можем использовать закрепленную память для более эффективной копирования данных с Host на GPU, чем память по умолчанию, выделенная с помощью malloc на хосте. Однако есть два типа закрепленных памяти: привязанная по умолчанию память и фиксированная память с нулевой копией.
Память по умолчанию, скопированная по умолчанию, копирует данные с Host на GPU в два раза быстрее обычной передачи, поэтому определенно преимущество (при условии, что у нас достаточно памяти хоста для блокировки страниц)
В другой версии закрепленной памяти, то есть нулевой копии, нам не нужно полностью копировать данные с хоста на GPU DRAM. Ядра считывают данные непосредственно из Host-памяти.
Мой вопрос: какой из этих типов закрепленной памяти является лучшей практикой программирования.
Ответы
Ответ 1
Я думаю, что это зависит от вашего приложения (в противном случае, почему бы оба они предоставили?)
Отображаемая, закрепленная память (нуль-копия) полезна, если:
-
Графический процессор не имеет собственной памяти и в любом случае использует RAM
-
Вы загружаете данные ровно один раз, но у вас есть много вычислений для выполнения на нем, и вы хотите скрыть задержки передачи данных через него.
-
Сторона хоста хочет изменить/добавить дополнительные данные или прочитать результаты, пока ядро все еще работает (например, связь).
-
Данные не вписываются в память GPU
Обратите внимание, что вы также можете использовать несколько потоков для копирования данных и параллельного запуска ядер.
Скопированная, но не отображаемая память лучше:
-
При загрузке или хранении данных несколько раз. Например: у вас есть несколько последующих ядер, выполнение работы пошагово - нет необходимости каждый раз загружать данные с хоста.
-
Существует не так много вычислений для выполнения и загрузки латентностей, которые не будут хорошо скрыты
Ответ 2
Отображаемая фиксированная память идентична другим типам закрепленной памяти во всех отношениях, за исключением того, что она отображается в адресное пространство CUDA, поэтому ее можно читать и записывать ядрами CUDA, а также использовать для передачи DMA с помощью копирующих устройств.
Преимущество не сопоставления фиксированной памяти было двояким: оно спасло вам некоторое адресное пространство, которое может быть ценным товаром в мире 32-разрядных платформ с графическими процессорами, которые могут содержать 3-4 ГБ ОЗУ. Кроме того, память, которая не отображается, не может быть случайно повреждена ядрами изгоев. Но эта проблема достаточно эзотерична, что функция единого адресного пространства в CUDA 4.0 приведет к отображению всех прикрепленных распределений по умолчанию.
Помимо вопросов, поднятых в книге Сандерса/Кандро, нужно помнить о других вещах:
-
Запись в память хоста из ядра (например, для публикации результатов в ЦП) хороша тем, что в этом случае у GPU нет латентности, и
-
ОЧЕНЬ ВАЖНО, что операции с памятью будут объединены - в противном случае даже SM 2.x и более поздние графические процессоры получают большой пропускной способности.