18 / 24 · Concetto
Blocchi, aloni e somme parziali
Per Th=Tw=2,Tc=1,Tm=2,un kernel 3×3,passo due,dilatazione uno, calcola i byte con buffer singolo di ingresso/pesi/somme a 32 bit/bias.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Suddividi i tensori per farli entrare in memoria
Scegli altezza di uscita Th,larghezza Tw,numero di canali di ingresso Tc e numero di canali di uscita Tm per un blocco. Un alone di ingresso si estende oltre il blocco di uscita. Per passo S,dilatazione D e kernel R, l'altezza di ingresso richiesta è (Th−1)S+(R−1)D+1; applica il corrispettivo orizzontale alla larghezza. Il riempimento ai confini può essere generato anziché letto.
Suddividere i canali di ingresso richiede di conservare ogni somma parziale di uscita attraverso tutti i blocchi di canale. Arrotondare ogni blocco in anticipo cambia l'operazione. Aggiungi il bias una volta nel primo blocco di canale, poi continua la stessa somma. Cambiare blocchi dei canali di uscita cambia anche pesi e bias.
Bilancio di memoria svolto
Per un'operazione 3×3, con passo e dilatazione unitari, siano Th=Tw=2,Tc=2,Tm=2. L'alone è 4×4, richiedendo 32 byte di ingresso int8. I pesi usano 2×2×3×3=36 byte. Otto somme parziali a 32 bit usano 32 byte e due bias a 32 bit ne usano otto. Totale:108 byte. Memoria per scale, indirizzi, validità e controllo è esclusa e richiede una disponibilità separata.
Il doppio buffering di ingresso e pesi richiede 2×(32+36)+32+8=176 byte, oltre un budget di 128 byte. Ridurre Tc a uno dà ingresso di sedici e pesi di diciotto byte. La memoria con doppio buffering diventa 2×34+32+8=108 byte. Conserva le somme parziali attraverso i due blocchi di canali di ingresso. Far entrare i buffer non dimostra che i trasferimenti possano sovrapporsi al calcolo; verifica separatamente la pianificazione.
Il passo due estende l'ingresso dello stesso blocco di uscita 2×2 a 5×5. Blocchi adiacenti possono condividere valori dell'alone, ma ricaricamenti indipendenti duplicano comunque il traffico. Distingui byte unici del tensore, un limite inferiore, dai trasferimenti effettivi dei blocchi.
Se M=5 e Tm=2, l'ultimo blocco ha un solo canale di uscita valido. Maschera l'accesso aggiuntivo a peso e uscita. Applica maschere equivalenti agli ultimi blocchi spaziali e di canali di ingresso. La documentazione NVIDIA CUTLASS descrive un vero approccio GEMM implicito che genera blocchi senza una matrice espansa completa. Qui calcoliamo memoria e somme parziali anziché eseguire quell'implementazione CUDA.
Prova tu
Per Th=Tw=2,Tc=1,Tm=2,un kernel 3×3,passo due,dilatazione uno, calcola i byte con buffer singolo di ingresso/pesi/somme a 32 bit/bias.
Leggi la spiegazione
L'ingresso 5×5 usa 25 byte. Aggiungi diciotto byte di pesi,32 byte di somme e otto byte di bias:83 byte, escludendo controllo e scale.