18 / 24 · Concept
Tuiles, halos et sommes partielles
Pour Th=Tw=2, Tc=1, Tm=2, un noyau 3×3, un pas de deux et une dilatation de un, calculez les octets d’entrée/poids/sommes sur 32 bits/biais avec un seul tampon.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Partitionner les tenseurs pour les faire tenir en mémoire
Choisissez pour une tuile la hauteur de sortie Th, la largeur Tw, le nombre de canaux d’entrée Tc et le nombre de canaux de sortie Tm. Un halo d’entrée s’étend au-delà de la tuile de sortie. Pour un pas S, une dilatation D et un noyau R, la hauteur d’entrée requise est (Th−1)S+(R−1)D+1 ; appliquez l’équivalent horizontal à la largeur. Le remplissage aux limites peut être généré au lieu d’être lu.
Découper les canaux d’entrée exige de conserver chaque somme partielle de sortie entre toutes les tuiles de canaux. Arrondir chaque tuile tôt change l’opération. Ajoutez le biais une seule fois dans la première tuile de canaux, puis poursuivez la même somme. Changer les tuiles de canaux de sortie change aussi les poids et biais.
Budget de stockage détaillé
Pour une opération 3×3 à pas et dilatation unitaires, soit Th=Tw=2, Tc=2, Tm=2. Le halo est 4×4, nécessitant 32 octets d’entrée int8. Les poids utilisent 2×2×3×3=36 octets. Huit sommes partielles sur 32 bits utilisent 32 octets et deux biais sur 32 bits en utilisent huit. Total : 108 octets. Échelles, adresses, validité et stockage de commande sont exclus et nécessitent une réserve distincte.
Des doubles tampons d’entrée et de poids nécessitent 2×(32+36)+32+8=176 octets, au-delà d’un budget de 128 octets. Réduire Tc à un donne seize octets d’entrée et dix-huit de poids. Le stockage à doubles tampons devient 2×34+32+8=108 octets. Conservez les sommes partielles entre les deux tuiles de canaux d’entrée. Faire tenir les tampons ne prouve pas que transferts et calcul peuvent se chevaucher ; vérifiez séparément l’ordonnancement.
Un pas de deux élargit l’étendue d’entrée de la même tuile de sortie 2×2 à 5×5. Des tuiles adjacentes peuvent partager des valeurs de halo, mais des rechargements indépendants dupliquent encore le trafic. Distinguez les octets uniques des tenseurs, une borne inférieure, des transferts réels de tuiles.
Si M=5 et Tm=2, la dernière tuile a un seul canal de sortie valide. Masquez l’accès supplémentaire aux poids et sorties. Appliquez des masques équivalents aux dernières tuiles spatiales et de canaux d’entrée. La documentation NVIDIA CUTLASS décrit une approche GEMM implicite réelle générant des tuiles sans matrice développée complète. Nous calculons ici stockage et sommes partielles sans exécuter cette implémentation CUDA.
Essayez vous-même
Pour Th=Tw=2, Tc=1, Tm=2, un noyau 3×3, un pas de deux et une dilatation de un, calculez les octets d’entrée/poids/sommes sur 32 bits/biais avec un seul tampon.
Lire l’explication
L’entrée 5×5 utilise 25 octets. Ajoutez dix-huit octets de poids, 32 de sommes et huit de biais : 83 octets, hors commande et échelles.