2011-03-06 13 views
26

En CUDA podemos utilizar 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 del malloc en el host. Sin embargo, hay dos tipos de memorias ancladas: memoria anclada por defecto y memoria fija cero copia.Memoria anotada por defecto Vs Memoria cero copia

El valor por defecto fijado copias de memoria los datos de anfitrión para la GPU doble de rápido que las transferencias normales, por lo que hay definitivamente una ventaja (siempre y cuando tengamos suficiente memoria anfitrión a la página de frenos)

En las diferentes versiones de clavado memoria, es decir, memoria de copia cero, no es necesario que copiemos 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?

Respuesta

29

creo que depende de su aplicación (de lo contrario, ¿por qué se proporcionará en ambos sentidos?)

asignada, la memoria fijada (copia cero) es útil cuando:

  • El GPU no tiene memoria en su propia memoria RAM y utiliza todos modos

  • se cargan los datos de una sola vez, pero hay una gran cantidad de cómputo para realizar en él y que desea ocultar las latencias de transferencia de memoria a través de él.

  • El lado del host quiere cambiar/añadir más datos, o leer los resultados, mientras que el kernel sigue en funcionamiento (por ejemplo, comunicación)

  • Los datos no encaja 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.

Fijado, pero no la memoria asignada es mejor:

  • Al cargar o almacenar los datos varias veces. Por ejemplo: tiene múltiples kernels subsiguientes, realizando el trabajo en pasos: no hay necesidad de cargar los datos desde el host cada vez.

  • No es que gran parte de cálculo de realizar y latencias de carga no va a ser ocultado así

+0

Sí exactamente. Encontré casi la misma descripción en el libro 'CUDA por ejemplo'. Afirman que la memoria mapeada es mejor cuando a) sus núcleos leen y escriben los datos exactamente una vez b) cuando tienen gráficos integrados, como la plataforma ION donde la CPU y la GPU comparten la misma memoria. – jwdmsd

11

memoria clavado asignado es idéntico al de otros tipos de memoria fijada en todos los aspectos, excepto que se asigna en el espacio de direcciones de CUDA, por lo que puede leerse y escribirse con kernels de CUDA, así como usarse para transferencias de DMA por parte de Copy Engines.

La ventaja de no mapear la memoria fija fue doble: le ahorró espacio de direcciones, lo 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á asignada no puede ser accidentalmente corrompida por núcleos fraudulentos. Pero esa preocupación es lo suficientemente esotérica como para que la característica del espacio de direcciones unificado en CUDA 4.0 hará que todas las asignaciones fijadas se mapeen de forma predeterminada.

Además de las cuestiones planteadas por el libro de Sanders/Kandrot, otras cosas a tener en cuenta:

  • escrito a la memoria del host de un núcleo (por ejemplo, para publicar los resultados a la CPU) es agradable en que la GPU no tiene ninguna latencia que cubrir en ese caso, y

  • es MUY IMPORTANTE que las operaciones de memoria se combinen; de lo contrario, incluso las GPU SM 2.xy posteriores obtienen un gran ancho de banda.

+0

¿Podría por favor ampliar los dos últimos puntos? En cuanto al primer punto, ¿a qué te refieres cuando dices que "la GPU no tiene ninguna latencia que cubrir en ese caso"? En cuanto al segundo punto, ¿por qué las operaciones en el marco de copia cero necesitan coalescencia? ¿Utilizan de todos modos la memoria global? – JackOLantern

+1

Si la GPU lee desde la memoria anclada asignada, tiene que encontrar algo que hacer hasta que llegue la solicitud de memoria. Si escribe en la memoria anclada mapeada, postea una escritura en el bus y continúa. No sé por qué tienen que combinarse. Coalescing es una construcción basada en Warp y debe tener algo que ver con la implementación del hardware. – ArchaeaSoftware

+0

Coalescencia disminuye la cantidad de operaciones de memoria, por lo que se volvió más importante para la memoria de copia cero a la que se accede mediante un bus PCI-E lento (en comparación con la memoria global de alto ancho de banda de la GPU) – Bulat

Cuestiones relacionadas