18 / 24 · Concepto
Bloques, halos y sumas parciales
Para Th=Tw=2,Tc=1,Tm=2,un núcleo 3×3,paso dos,dilatación uno, calcula los bytes de entrada/pesos/sumas de 32 bits/sesgos con un solo búfer.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Divide los tensores para ajustarlos al almacenamiento
Elige la altura de salida Th,anchura Tw,número de canales de entrada Tc y número de canales de salida Tm de un bloque. Un halo de entrada se extiende más allá del bloque de salida. Para paso S,dilatación D y núcleo R, la altura de entrada necesaria es (Th−1)S+(R−1)D+1; aplica el equivalente horizontal a la anchura. El relleno del borde puede generarse en vez de recuperarse de memoria.
Dividir los canales de entrada exige conservar la suma parcial de cada salida a través de todos los bloques de canales. Redondear pronto cada bloque cambia la operación. Añade el sesgo una vez en el primer bloque de canales y después continúa la misma suma. Cambiar los bloques de canales de salida también cambia pesos y sesgos.
Presupuesto de almacenamiento resuelto
Para una operación 3×3 con paso y dilatación unitarios, toma Th=Tw=2,Tc=2,Tm=2. El halo es 4×4 y requiere 32 bytes de entrada int8. Los pesos usan 2×2×3×3=36 bytes. Ocho sumas parciales de 32 bits usan 32 bytes y dos sesgos de 32 bits usan ocho. Total:108 bytes. Se excluyen escalas, direcciones, validez y almacenamiento de control, que necesitan una asignación separada.
Usar doble búfer de entrada y pesos requiere 2×(32+36)+32+8=176 bytes, por encima de un presupuesto de 128 bytes. Reducir Tc a uno da dieciséis bytes de entrada y dieciocho de pesos. El almacenamiento con doble búfer pasa a 2×34+32+8=108 bytes. Conserva las sumas parciales a través de los dos bloques de canales de entrada. Que quepan los búferes no prueba que las transferencias puedan solaparse con el cálculo; comprueba la planificación por separado.
El paso dos amplía el intervalo de entrada del mismo bloque de salida 2×2 a 5×5. Los bloques adyacentes pueden compartir valores de halo, pero las recargas independientes siguen duplicando tráfico. Distingue los bytes únicos del tensor, una cota inferior, de las transferencias reales de bloques.
Si M=5 y Tm=2, el último bloque tiene un canal de salida válido. Enmascara el acceso adicional a pesos y salida. Aplica máscaras equivalentes a los últimos bloques espaciales y de canales de entrada. La documentación de NVIDIA CUTLASS describe un enfoque real de GEMM implícita que genera bloques sin una matriz expandida completa. Aquí calculamos almacenamiento y sumas parciales, en lugar de ejecutar esa implementación CUDA.
Inténtalo tú
Para Th=Tw=2,Tc=1,Tm=2,un núcleo 3×3,paso dos,dilatación uno, calcula los bytes de entrada/pesos/sumas de 32 bits/sesgos con un solo búfer.
Leer la explicación
La entrada 5×5 usa 25 bytes. Añade dieciocho bytes de pesos,32 de sumas y ocho de sesgos:83 bytes, excluyendo control y escalas.