Por que a CUDA tem a memory fixada tão rapidamente?

Observo aumentos substanciais na transferência de dados quando uso memory fixa para transferências de dados CUDA. No linux, a chamada de sistema subjacente para conseguir isso é mlock. A partir da página man do mlock, ele afirma que bloquear a página impede que ela seja trocada:

O mlock () bloqueia páginas no intervalo de endereços, iniciando em addr e continuando por len bytes. Todas as páginas que contêm uma parte do intervalo de endereços especificado são garantidas como residentes na RAM quando a chamada retorna com sucesso;

Em meus testes, eu tive alguns shows de memory livre no meu sistema, então nunca houve qualquer risco de que as páginas da memory pudessem ter sido trocadas, mas ainda observei a aceleração. Alguém pode explicar o que realmente está acontecendo aqui ?, qualquer insight ou informação é muito apreciada.

O CUDA Driver verifica se o intervalo de memory está bloqueado ou não e, em seguida, usará um caminho de código diferente. A memory bloqueada é armazenada na memory física (RAM), portanto, o dispositivo pode buscá-la sem a ajuda da CPU (DMA, também conhecido como cópia assíncrona; o dispositivo só precisa da lista de páginas físicas). A memory não bloqueada pode gerar uma falha de página no access e é armazenada não apenas na memory (por exemplo, pode estar em troca), portanto o driver precisa acessar cada página da memory não bloqueada, copiá-la no buffer fixo e passá-la para DMA (cópia sincronizada, página por página).

Como descrito aqui http://forums.nvidia.com/index.php?showtopic=164661

A memory do host usada pela chamada de cópia de assinaturas assíncrona precisa ser bloqueada por meio de cudaMallocHost ou cudaHostAlloc.

Também posso recomendar a verificação dos manuais cudaMemcpyAsync e cudaHostAlloc em developer.download.nvidia.com. HostAlloc diz que o driver cuda pode detectar a memory fixa:

O driver controla os intervalos de memory virtual alocados com essa function (cudaHostAlloc) e acelera automaticamente as chamadas para funções como cudaMemcpy ().

Se as páginas de memory ainda não tivessem sido acessadas, elas provavelmente nunca foram trocadas para começar . Em particular, as páginas recém-alocadas serão cópias virtuais da “página zero” universal e não terão uma instanciação física até que sejam gravadas. Novos mapas de arquivos no disco também permanecerão no disco até serem lidos ou gravados.

CUDA usa DMA para transferir memory fixada para GPU. A memory do host paginável não pode ser usada com o DMA porque eles podem residir no disco. Se a memory não estiver fixada (ou seja, bloqueada pela página), ela será primeiro copiada para um buffer “temporário” de página bloqueada e depois copiada para a GPU por meio do DMA. Portanto, usando a memory fixada, você economiza tempo para copiar da memory do host paginável para a memory host bloqueada pela página.