sistema memoria compartida cuda memory-optimization

cuda - sistema - confusión de optimización de memoria compartida



memoria compartida del sistema windows 10 (1)

No funciona así. La cantidad de bloques que se programarán para ejecutarse en un momento dado en un único SM siempre será el mínimo de los siguientes:

  1. 8 bloques
  2. Número de bloques cuya suma de memoria compartida estática y dinámicamente asignada es inferior a 16 kb o 48 kb, según la configuración y la arquitectura de la GPU. También hay limitaciones de tamaño de página de memoria compartida, lo que significa que las asignaciones por bloque se redondean al siguiente múltiplo más grande del tamaño de página.
  3. La cantidad de bloques cuya suma de uso de registro por bloque es inferior a 8192/16384/32678 según la arquitectura. También hay tamaños de página de archivo de registro que significa que las asignaciones por bloque se redondean al siguiente múltiplo más grande del tamaño de página.

Eso es todo lo que hay que hacer. No hay "paginación" de memoria compartida para acomodar más bloques. NVIDIA produce una hoja de cálculo para calcular la ocupación que se envía con el kit de herramientas y está disponible como descarga separada. Puedes ver las reglas exactas en las fórmulas que contiene. También se tratan en la sección 4.2 de la guía de programación de CUDA.

He escrito una aplicación en cuda, que usa 1kb de memoria compartida en cada bloque. Como solo hay 16kb de memoria compartida en cada SM, entonces solo se pueden acomodar 16 bloques en general (¿entiendo esto correctamente?), Aunque a la vez solo se pueden programar 8, pero ahora si algún bloque está ocupado haciendo la operación de memoria , entonces otro bloque se programará en gpu, pero toda la memoria compartida es utilizada por otros 16 bloques que ya han sido programados allí, entonces ¿cuda no programará más bloques en el mismo sm, a menos que los bloques asignados previamente estén completamente terminados? o moverá la memoria compartida de un bloque a la memoria global, y asignará otro bloque allí (en este caso, ¿deberíamos preocuparnos por la latencia de acceso a la memoria global?)