ultima tutorial programar mundo hola ejemplos c++ c linux cuda

c++ - tutorial - programar gpu



¿Por qué CUDA fija la memoria tan rápido? (3)

Observo aceleraciones sustanciales en la transferencia de datos cuando uso la memoria anclada para las transferencias de datos CUDA. En linux, el sistema subyacente llamado para lograr esto es mlock. Desde la página de manual de mlock, se indica que el bloqueo de la página evita que se pueda cambiar:

mlock () bloquea las páginas en el rango de direcciones comenzando en addr y continuando para len bytes. Se garantiza que todas las páginas que contienen una parte del rango de direcciones especificado residirán en la RAM cuando la llamada se realice con éxito;

En mis pruebas, tenía algunos conciertos de memoria libre en mi sistema, por lo que nunca hubo ningún riesgo de que las páginas de memoria pudieran haber sido intercambiadas, pero aún observé la aceleración. ¿Alguien puede explicar lo que realmente está pasando aquí? Cualquier información o información es muy apreciada.


CUDA usa DMA para transferir la memoria anclada a la GPU. La memoria del host paginable no se puede usar con DMA porque pueden residir en el disco. Si la memoria no está anclada (es decir, bloqueada en la página), primero se copia en un búfer de "almacenamiento" bloqueado en la página y luego se copia en la GPU a través de DMA. Por lo tanto, al utilizar la memoria anclada, ahorra tiempo para copiar desde la memoria del host de paginación a la memoria del host bloqueada por página.


El controlador CUDA comprueba si el rango de memoria está bloqueado o no y luego utilizará una ruta de código diferente. La memoria bloqueada se almacena en la memoria física (RAM), por lo que el dispositivo puede obtenerla sin ayuda de la CPU (DMA, también conocida como copia asíncrona; 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), por lo que el controlador debe acceder a cada página de la memoria no bloqueada, copiarla en el búfer fijado y pasarla a DMA (Sincronización, copia página por página).

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

la memoria del host utilizada por la llamada asincrónica de copia mem debe estar bloqueada en la página a través de cudaMallocHost o cudaHostAlloc.

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

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 las páginas de memoria aún no se habían accedido, probablemente nunca se intercambiaron para empezar . En particular, las páginas recién asignadas serán copias virtuales de la "página cero" universal y no tendrán una instanciación física hasta que se escriban. Los nuevos mapas de archivos en el disco también permanecerán puramente en el disco hasta que se lean o escriban.