В функции моего устройства я сохраняю значение в глобальной памяти хоста (закрепленное или с нулевой копией)
Что я должен использовать между нулевым копированием и закреплением для лучшей производительности?
В 64-битной ОС, где действует CUDA UVA, нет существенной разницы между закрепленной памятью и нулевым копированием (т.е. закрепленным и отображенным). Это потому, что, как указано здесь и в других местах:
"функция унифицированного адресного пространства в CUDA 4.0 приведет к сопоставлению всех закрепленных выделений по умолчанию"
«Унифицированная функция адресного пространства в CUDA 4.0» - это CUDA UVA , и она будет автоматически действовать в 64-битной ОС, где используется CUDA (возможно, за исключением Windows 7 WDDM). Поскольку использование 32-битной CUDA в течение некоторого времени постепенно устарело, 64-битная ОС, вероятно, является тем, что используется большинством в настоящее время.
Однако, даже если бы вы были в режиме без UVA, все равно не было бы никакого способа ответить на вопрос. Причина этого заключается в том, что закрепленная, но не сопоставленная память хоста не доступна напрямую для операций чтения / записи кода устройства CUDA, о чем вы спрашиваете в своем вопросе. Именно характеристика отображения (так называемая «нулевая копия») позволяет коду устройства CUDA непосредственно считывать и записывать местоположения в памяти хоста.
Таким образом, желаемая функциональность не может быть достигнута в любом случае, если у вас есть доступ к «закрепленной, но не сопоставленной» памяти хоста.