para kali guest gpus geforce full for developer additions cuda opencl gpgpu gpu-programming memory-alignment

cuda - guest - virtual box on kali



Alineación de accesos de memoria GPU de un kernel de convolución de imagen(OpenCL/CUDA) (1)

Para un núcleo de convolución, cada región (por ejemplo, región (0,1) o región (2,1), etc.) también debe incluir un "halo" de datos a su alrededor, de modo que cuando el núcleo de convolución está funcionando en un elemento de datos en al borde de la región, tiene un conjunto adecuado de vecinos de ese elemento de datos para calcular la convolución en ese punto de datos. Esto significa que para la región (0,0) que tiene el elemento de datos (0,0) en su esquina superior izquierda, necesito elementos (-1, 0), (-2, 0) etc. para calcular la convolución en el elemento (0,0).

Ahora, si almaceno la imagen normalmente, para que ese elemento (0,0) esté en la ubicación 0 de la memoria (u otra dirección alineada de 64 bytes), entonces cuando acceda a los elementos anteriores a ese punto para la convolución, estaré acceder a datos fuera de mi región alineada de 64 bytes. Por lo tanto, podemos "rellenar" la columna más a la izquierda de la imagen con elementos de datos adicionales "a la izquierda", es decir, antes, en la dirección, para que el núcleo de convolución recoja valores que están todos dentro de la región alineada de 64 bytes, y yo no sobre un límite de 64 bytes. En lugar de iniciar el almacenamiento de la imagen en la ubicación de memoria 0, iniciamos el almacenamiento de halo en la ubicación de memoria cero, y el primer elemento de datos de imagen comienza en la ubicación 0 + ancho de halo. Este relleno también puede tener el efecto de alinear el borde halo de otras regiones, como lo indica la intersección de las líneas punteadas rojas en la imagen, suponiendo que las dimensiones xey de la región son múltiplos de las dimensiones xey del grupo de trabajo, como se indica en el diagrama.

Ahora supongamos también que la imagen tiene un ancho distinto de la potencia de 2 (por ejemplo, 1920 píxeles de ancho para una imagen HD). Si tuviéramos que incluir simplemente el ancho del halo como relleno en el lado derecho de la imagen (es decir, al final de una fila de píxeles), y luego comenzamos el área de halo de la siguiente fila de píxeles inmediatamente después de eso, tendríamos tampoco es probable que tenga una región alineada correctamente comenzando en la siguiente fila de píxeles (incluido halo). Por lo tanto, colocamos relleno adicional al final de cada fila (que no se toca con ninguna operación de convolución, es solo espacio desperdiciado) de modo que cuando comenzamos el área de halo de la siguiente fila de píxeles, comienza en una dirección correctamente alineada.

Esta discusión y método (y la pregunta, en mi opinión) se centran realmente en asegurar que la dirección de inicio de cada acceso al grupo de trabajo esté alineada. Siempre que la dirección de inicio del primer grupo de trabajo esté alineada (a través del relleno adecuado y ajuste del almacenamiento de la imagen en la memoria), y los grupos de trabajo tengan las dimensiones adecuadas (por ejemplo, 16 de ancho, con 4 bytes por trabajador), la dirección de inicio del el próximo grupo de trabajo también estará alineado. Por supuesto, habrá superposición entre los accesos de datos de los grupos de trabajo adyacentes, ya que la región de halo para los grupos de trabajo adyacentes se superpone.

La alineación tal como la estoy usando aquí tiene una definición bastante simple. Una dirección en la memoria es 2 ** n byte alineado si los n bits menos significativos de la dirección son todos cero. Por lo tanto, una región alineada de 64 bytes tiene una dirección de inicio con 6 bits menos significativos, todos cero. Esto es generalmente útil en estas arquitecturas para satisfacer la carga de memoria y los requisitos de almacenamiento de la arquitectura, y en particular de los subsistemas DRAM que contienen. Los accesos modernos a los bancos de memoria DRAM siempre devuelven múltiples bytes, por lo que podemos hacer un mejor uso efectivo de la transferencia si estamos usando todos esos bytes al mismo tiempo, en el mismo lugar del código. Para obtener una cobertura adicional sobre la alineación y el efecto que tiene en la convergencia y la mejora en el acceso a los datos, es posible que esté interesado en este seminario web (y diapositivas ) de la página del seminario web de nvidia . Para una mirada rápida, las diapositivas 26-33 de esta presentación cubren las ideas básicas.

Para entender cómo cumplir con los requisitos de alineamiento, leo el siguiente pasaje del libro Heterogeneous Computing con OpenCL p.no: 157, varias veces. Esto muestra cómo colocar relleno para un problema en la convolución de la imagen (suponiendo un tamaño de grupo de trabajo de 16 x 16).

Alineación para acceder a la memoria

El rendimiento de las GPU NVIDIA y AMD se beneficia de la alineación de datos en la memoria global. Particularmente para NVIDIA, alinear accesos en límites de 128 bytes y acceder a segmentos de 128 bytes se asignará idealmente al hardware de memoria. Sin embargo, en este ejemplo, los grupos de trabajo de 16 amplios solo accederán a segmentos de 64 bytes, por lo que los datos deben estar alineados a direcciones de 64 bytes. Esto significa que la primera columna a la que accede cada grupo de trabajo debe comenzar en una dirección alineada de 64 bytes. En este ejemplo, la opción de que los píxeles del borde no produzcan valores determina que el desplazamiento para todos los grupos de trabajo será un múltiplo de las dimensiones del grupo de trabajo (es decir, para un grupo de trabajo de 16 x 16, el grupo de trabajo comenzará a acceder a datos en la columna N * 16) . Para asegurarse de que cada grupo de trabajo se alinea correctamente, el único requisito es rellenar los datos de entrada con columnas adicionales para que su ancho se convierta en un múltiplo de la dimensión X del grupo de trabajo.

1-¿Alguien puede ayudarme a entender cómo después de rellenar la primera columna a la que accede cada grupo de trabajo está comenzando en una dirección alineada de 64 bytes (el requisito mencionado en el pasaje anterior, ¿no?)?

2-También la figura es la declaración correcta: para un grupo de trabajo de 16 x 16, el grupo de trabajo comenzará a acceder a los datos en la columna N * 16.

si es correcto, el grupo de trabajo 1,2 como se muestra en la figura debería comenzar a acceder a los datos en la columna 1x16, contrario a lo que se muestra en la figura. ¡Estoy totalmente confundido! :(

Actualización: Q-2 ahora está claro para mí. En realidad, el grupo de trabajo que se muestra en la figura es 2,1 (en la convención abierta, columna primero), por lo que es perfectamente correcto: 2x16 = 32 y no 1x16, como estaba pensando.

Pero pregunta no. 1 sigue sin respuesta.