Memoria Fija Predeterminada Vs Memoria De Copia Cero


En CUDA podemos usar la memoria fija para copiar de manera más eficiente los datos del Host a la GPU que la memoria predeterminada asignada a través de malloc en el host. Sin embargo, hay dos tipos de memorias ancladas la memoria anclada predeterminada y la memoria anclada de copia cero.

La memoria fija predeterminada copia los datos del Host a la GPU dos veces más rápido que las transferencias normales, por lo que definitivamente hay una ventaja (siempre que tengamos suficiente memoria del host para bloquear la página)

En el una versión diferente de la memoria fija, es decir, memoria de copia cero, no necesitamos copiar los datos del host a la DRAM de la GPU por completo. Los núcleos leen los datos directamente desde la memoria del host.

Mi pregunta es: Cuál de estos tipos de memoria fija es una mejor práctica de programación.

 28
Author: jwdmsd, 2011-03-06

2 answers

Creo que depende de su solicitud (de lo contrario, ¿por qué proporcionarían ambas formas?)

La memoria fija mapeada (copia cero) es útil cuando:

  • La GPU no tiene memoria por sí sola y usa RAM de todos modos

  • Se cargan los datos exactamente una vez, pero se tiene una gran cantidad de computación que realizar en ella y se desea ocultar latencias de transferencia de memoria a través de ella.

  • El lado del host quiere cambiar / agregar más datos, o leer los resultados, mientras el kernel todavía está en ejecución (por ejemplo, comunicación)

  • Los datos no caben en la memoria de la GPU

Tenga en cuenta que también puede usar múltiples flujos para copiar datos y ejecutar núcleos en paralelo.

La memoria fija, pero no mapeada es mejor:

  • Cuando carga o almacena los datos varias veces. Por ejemplo: tiene varios núcleos posteriores, realizando el trabajo en pasos-no hay necesidad de cargar los datos del host cada tiempo.

  • No hay mucho cálculo que realizar y las latencias de carga no se van a ocultar bien

 29
Author: CygnusX1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-06 09:45:39

La memoria anclada mapeada es idéntica a otros tipos de memoria anclada en todos los aspectos, excepto que está mapeada en el espacio de direcciones CUDA, por lo que puede ser leída y escrita por núcleos CUDA, así como utilizada para transferencias DMA por los Motores de copia.

La ventaja de no mapear la memoria fija era doble: le ahorraba algo de espacio de direcciones, que puede ser una mercancía preciosa en un mundo de plataformas de 32 bits con GPU que pueden contener 3-4G de RAM. Además, la memoria que no está mapeada no puede ser corrompido accidentalmente por núcleos pícaros. Pero esa preocupación es lo suficientemente esotérica como para que la función de espacio de direcciones unificado en CUDA 4.0 haga que todas las asignaciones ancladas se asignen de forma predeterminada.

Además de los puntos planteados por el libro Sanders/Kandrot, otras cosas a tener en cuenta:

  • Escribir en memoria host desde un núcleo (por ejemplo, para publicar resultados en la CPU) es bueno en que la GPU no tiene ninguna latencia que cubrir en ese caso, y

  • Es MUY IMPORTANTE que las operaciones de memoria se fusionen-de lo contrario, incluso SM 2.las GPU x y posteriores reciben un gran golpe de ancho de banda.

 11
Author: ArchaeaSoftware,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-13 14:39:08