organización memoria gestion cuda

cuda - gestion - 3.3 organización de memoria virtual



Memoria fija predeterminada Vs memoria de copia cero (2)

En CUDA podemos usar la memoria anclada para copiar más eficientemente 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 fijadas: la memoria predeterminada predeterminada y la memoria fija sin copia .

La memoria anclada 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 la versión diferente de la memoria fija, es decir, la 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?


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

La memoria asignada y anclada (copia cero) es útil cuando:

  • La GPU no tiene memoria propia y utiliza RAM de todos modos

  • Usted carga los datos exactamente una vez, pero tiene muchos cálculos que realizar y desea ocultar las latencias de transferencia de memoria a través de ellos.

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

  • Los datos no caben en la memoria de la GPU

Tenga en cuenta que también puede usar varias secuencias para copiar datos y ejecutar núcleos en paralelo.

La memoria pineada, pero no asignada es mejor:

  • Cuando carga o almacena los datos varias veces. Por ejemplo: tiene varios kernels posteriores, realizando el trabajo en pasos, no es necesario cargar los datos desde el host cada vez.

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


La memoria asignada asignada es idéntica a otros tipos de memoria fijada en todos los aspectos, excepto que está asignada al espacio de direcciones CUDA, por lo que pueden ser leídas y escritas por los núcleos CUDA, así como utilizadas para transferencias DMA por los motores de copia.

La ventaja de no asignar la memoria anclada fue doble: le ahorró algo de espacio de direcciones, lo que puede ser una valiosa mercancía en un mundo de plataformas de 32 bits con GPU que pueden contener 3-4 G de RAM. Además, la memoria que no está asignada no puede corromperse accidentalmente por los núcleos maliciosos. Pero esa preocupación es lo suficientemente esotérica como para que la función de espacio de direcciones unificadas en CUDA 4.0 haga que todas las asignaciones fijadas se asignen de forma predeterminada.

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

  • escribir en la memoria del host desde un kernel (por ejemplo, para publicar resultados en la CPU) es bueno porque la GPU no tiene ninguna latencia que cubrir en ese caso, y

  • Es MUY IMPORTANTE que las operaciones de memoria se unan. De lo contrario, incluso las GPU SM 2.xy posteriores toman un gran impacto de ancho de banda.