Драйвер CUDA проверяет , заблокирован ли диапазон памяти или нет, и тогда он будет использовать другой кодовый путь. Заблокированная память хранится в физической памяти (ОЗУ), поэтому устройство может извлекать ее без помощи ЦП (DMA, так называемая асинхронная копия; устройству нужен только список физических страниц). Незащищенная память может генерировать ошибку страницы при доступе, и она сохраняется не только в памяти (например, это может быть подкачка), поэтому драйверу необходимо получить доступ к каждой странице неблокированной памяти, скопировать ее в закрепленный буфер и передать ее в DMA (синхронное, постраничное копирование).
Как описано здесь http://forums.nvidia.com/index.php?showtopic=164661
память хоста, используемая при асинхронном вызове копии mem, должна быть заблокирована на странице через cudaMallocHost или cudaHostAlloc.
Я также могу порекомендовать ознакомиться с руководствами cudaMemcpyAsync и cudaHostAlloc по адресу developer.download.nvidia.com. HostAlloc говорит, что драйвер cuda может обнаружить закрепленную память:
Драйвер отслеживает диапазоны виртуальной памяти, выделенные этой функцией (cudaHostAlloc), и автоматически ускоряет вызовы таких функций, как cudaMemcpy ().