Altifigence Academy

13 / 20 · Concetto

Suddivisione in blocchi e riempimento ai confini

Associa matrici più grandi a una griglia più piccola e gestisci riempimento con zeri e maschere di uscita.

Suddividi prima lo spazio di uscita

Una griglia N×N gestisce un risultato M×P più grande usando ceil(M/N)×ceil(P/N) blocchi spaziali. La configurazione di base mantiene l'intera riduzione K in ciascun blocco e azzera tra i blocchi di uscita. Il wrapper memorizza l'origine del blocco r0,c0; il PE locale (i,j) corrisponde al C globale (r0+i,c0+j). Lo sfasamento dipende dalle coordinate locali.

Prendi N=2 e M=P=K=3. Siano A=[[1,2,3],[4,5,6],[7,8,9]] e B=[[1,0,2],[0,1,0],[2,0,1]]. Il loro prodotto è [[7,2,5],[16,5,14],[25,8,23]]. Le quattro origini dei blocchi sono (0,0), (0,2), (2,0) e (2,2).

Riempi gli operandi, maschera le scritture

Fornisci le righe A e le colonne B fuori intervallo come token zero validi. Ogni PE consuma ancora K termini, conservando il semplice contratto di completamento. Rendere invece non validi i termini di riempimento può lasciare alcuni conteggi sotto K per sempre. Maschera separatamente le scritture dei risultati per impedire scritture fuori dalla matrice reale.

Il blocco finale usa A=[[7,8,9],[0,0,0]] e B=[[2,0],[0,0],[1,0]]. Il risultato locale è [[23,0],[0,0]], ma soltanto il valore in alto a sinistra può essere scritto in C(2,2). Uno zero numerico non rende sicuro un indirizzo fuori intervallo.

Ogni blocco usa cinque fronti di avanzamento, per un totale di venti su quattro blocchi sequenziali, escludendo clear, caricamento e trasferimento di uscita. La griglia esegue quarantotto MAC con riempimento; soltanto ventisette appartengono al vero prodotto 3×3.

Suddividere la riduzione richiede somme conservate

Suddividere K richiede di combinare somme parziali per la stessa uscita. C(0,0)=1×1+2×0+3×2=7 si divide nei parziali uno e sei per K=2+1. Azzerare l'accumulatore finale tra quelle riduzioni lascia soltanto sei. Mantieni l'accumulatore oppure combina altrove somme parziali estese. Quantizzare ogni parziale prima della combinazione può differire dal quantizzare una sola volta la somma completa.

Il progetto finale inizia con blocchi spaziali e K completo. Prova confini con un solo elemento, dimensioni divisibili per N, un blocco finale con una sola uscita reale, zeri validi di riempimento e maschere di uscita. Usa le coordinate globali come chiave dello scoreboard di riferimento affinché cambiare l'ordine dei blocchi non cambi il risultato atteso.

Prova tu

Per il blocco (0,2) nell'esempio 3×3, indica maschera di uscita e risultato locale. Quali sono le somme parziali di C(0,2) quando K si divide in 2+1?

Leggi la spiegazione

Il risultato locale è [[5,0],[14,0]] e la maschera [[1,0],[1,0]]. C(0,2)=1×2+2×0+3×1 ha somme parziali due e tre, per un totale di cinque.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.