¿Por qué CUDA cubrió la memoria tan rápido?

Observo aceleraciones sustanciales en la transferencia de datos cuando uso la memoria fija para las transferencias de datos CUDA. En Linux, la llamada al sistema subyacente para lograr esto es mlock. Desde la página man de mlock, indica que bloquear la página evita que se cancele:

mlock () bloquea las páginas en el rango de direcciones comenzando por addr y continuando por len bytes. Se garantiza que todas las páginas que contienen una parte del rango de direcciones especificado residen en la memoria RAM cuando la llamada se devuelve correctamente;

En mis pruebas, tuve pequeños conciertos de memoria libre en mi sistema por lo que nunca hubo ningún riesgo de que las páginas de memoria pudieran haberse cambiado, sin embargo, aún observé la aceleración. ¿Alguien puede explicar lo que está sucediendo aquí ?, cualquier idea o información es muy apreciada.

Controlador CUDA comprueba si el rango de memoria está bloqueado o no y luego utilizará una ruta de encoding diferente. La memoria bloqueada se almacena en la memoria física (RAM), por lo que el dispositivo puede buscarla sin ayuda de la CPU (DMA, también conocida como copia asincrónica, el dispositivo solo necesita una lista de páginas físicas). La memoria no bloqueada puede generar un error de página en el acceso y se almacena no solo en la memoria (por ejemplo, puede estar en intercambio), entonces el controlador necesita acceder a cada página de la memoria no bloqueada, copiarla en el búfer fijo y pasarla a DMA (Syncronious, copia página por página).

Como se describe aquí http://forums.nvidia.com/index.php?showtopic=164661

la memoria de host utilizada por la llamada de copia de memoria asíncrona debe estar bloqueada en la página a través de cudaMallocHost o cudaHostAlloc.

También puedo recomendar comprobar los manuales de cudaMemcpyAsync y cudaHostAlloc en developer.download.nvidia.com. HostAlloc dice que el controlador de cuda puede detectar la memoria fijada:

El controlador rastrea los rangos de memoria virtual asignados con esta función (cudaHostAlloc) y acelera automáticamente las llamadas a funciones como cudaMemcpy ().

Si aún no se había accedido a las páginas de memoria, probablemente nunca se intercambiaron para empezar . En particular, las páginas recientemente asignadas serán copias virtuales de la “página cero” universal y no tendrán una instancia física hasta que se escriban. Los nuevos mapas de archivos en el disco también permanecerán puramente en el disco hasta que sean leídos o escritos.

CUDA usa DMA para transferir memoria fija a la GPU. La memoria de host paginable no se puede usar con DMA porque pueden residir en el disco. Si la memoria no está fijada (es decir, bloqueada en la página), primero se copia en un búfer de “puesta en escena” bloqueado en la página y luego se copia a la GPU a través de DMA. Por lo tanto, al usar la memoria anclada, ahorra tiempo para copiar de la memoria de host paginable a la memoria de host paginada.