← Ultimi articoli
💻 computer science

85.30 GFLOPS Single-Core FP32 Matrix Multiplication on AMD Zen 3: A Systematic Study of Cache Blocking, Register Blocking, FMA Chaining, and On-the-Fly Packing

Questo articolo presenta uno studio di ottimizzazione sistematica sull'architettura microarchitetturale AMD Zen 3 che raggiunge 85,30 GFLOPS nella moltiplicazione di matrici FP32 single-core valutando 28 configurazioni distinte di cache/register blocking, FMA chaining e on-the-fly packing, identificando infine un design campione che raggiunge il 63,5% della performance teorica di picco introducendo al contempo un modello predittivo per ottimizzazioni future.

Autori originali: Lucas Lima Freitag

Pubblicato 2026-07-15
📖 6 min di lettura🧠 Approfondimento

Autori originali: Lucas Lima Freitag

Articolo originale sotto licenza CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Questa è una spiegazione generata dall'IA dell'articolo qui sotto. Non è stata scritta né approvata dagli autori. Per precisione tecnica, consulta l'articolo originale. Leggi il disclaimer completo

Immagina di dover spostare un enorme cumulo di sabbia (dati) da un lato di un gigantesco magazzino all'altro, ma devi farlo usando un piccolo braccio robotico super veloce (il processore). L'obiettivo è mescolare la sabbia con una formula speciale (moltiplicazione di matrici) il più velocemente possibile. Questo articolo è un registro dettagliato del diario di un ricercatore, Lucas, che cerca di far muovere quel braccio robotico il più velocemente possibile su un tipo specifico di chip per computer chiamato AMD Zen 3.

Il Grande Obiettivo: Quanto è Veloce il "Veloce"?

Il braccio robotico ha una velocità massima teorica di 134,4 GFLOPS (ovvero 134,4 miliardi di operazioni matematiche al secondo). Immagina questa come il limite di velocità su un'autostrada. Lucas voleva vedere quanto poteva avvicinarsi a quel limite di velocità senza costruire un'auto nuova, semplicemente regolando il motore.

Dopo aver testato 28 diverse strategie di guida, ha trovato una configurazione "campione" (chiamata MX24) che ha raggiunto gli 85,30 GFLOPS. Si tratta di circa il 63,5% della velocità massima. Non è un perfetto 100%, ma è un salto enorme rispetto alla linea di partenza, che era un metodo lento e goffo che girava a soli 1,51 GFLOPS. In effetti, il suo metodo migliore è stato 57 volte più veloce della versione base non ottimizzata.

La Strategia Vincente: La Danza "4-Righe, Catena-4"

Per ottenere questa velocità, Lucas ha dovuto capire come organizzare la sabbia e i movimenti del robot. Ecco le mosse chiave che ha scoperto:

1. Il Trucco dell'Imballaggio "Al Volo"
Immagina che la sabbia sia conservata in una griglia dove devi camminare in diagonale per prendere il granello successivo. È lento e faticoso. Lucas ha scoperto che copiare un piccolo pezzo di sabbia in una linea dritta e ordinata proprio prima che il robot ne abbia bisogno (chiamato imballaggio on-the-fly) è stata la mossa magica. È come avere un aiutante che corre avanti e impila i mattoni in una fila perfetta in modo che il robot possa solo prenderli uno dopo l'altro senza inciampare. Questo ha battuto il vecchio metodo di prenderli così come venivano, ed è stato persino migliore di riorganizzare l'intero magazzino in anticipo.

2. L'Impilamento "4-Righe"
Il robot ha un numero limitato di mani (registri) per tenere la sabbia mentre lavora. Lucas ha provato a tenere 2 righe di sabbia, poi 4, poi 8.

  • 2 Righe: Troppe poche. Il robot doveva fermarsi e cercare nuova sabbia troppo spesso.
  • 8 Righe: Troppe! Le mani del robot erano così piene che doveva far cadere la sabbia sul pavimento (memoria) e raccoglierla continuamente. Questo è stato un disastro.
  • 4 Righe: Il punto di equilibrio. Anche se il robot doveva far cadere alcuni granelli sul pavimento e raccoglierli di nuovo (un processo chiamato "spilling"), il lavoro extra valeva la pena perché poteva processare più sabbia contemporaneamente. Questo singolo cambiamento ha reso il robot più veloce del 59% rispetto al metodo a 2 righe.

3. Il Ritmo "Catena-4"
Il braccio del robot impiega 4 secondi (cicli) per finire una singola mossa matematica prima di poter iniziare la successiva sullo stesso pezzo di sabbia. Se il robot facesse solo una mossa e aspettasse, rimarrebbe inattivo per 3 secondi.
Lucas ha scoperto che se il robot teneva 4 diversi mucchi di sabbia nelle sue mani e lavorava su di essi in un ciclo (Catena-4), poteva mantenere il braccio in movimento costante. Mentre un mucchio di sabbia si sta "cucinando", il robot lavora sugli altri. Questo si sposa perfettamente con il tempo di "cottura" di 4 secondi del robot, mantenendo il motore a pieno regime.

Cosa Non Ha Funzionato (La Lista dei "Non Farlo")

A volte, ciò che pensi che dovrebbe funzionare, in realtà peggiora le cose. Lucas ha testato alcune idee popolari e ha scoperto che sono terribili per questo specifico robot:

  • L'Errore del "Pre-fetch": Spesso si dice ai robot di "guardare avanti" e prendere il prossimo granello di sabbia prima che ne abbiano bisogno. Lucas ha provato questo, ma gli occhi integrati del robot erano già così bravi a vedere il modello che i comandi extra di "guardare avanti" hanno solo creato intralcio. Questo ha rallentato il robot di circa l'8%.
  • Il Deposito "Non Temporale": Esiste un trucco dove si dice al robot di scaricare la sabbia direttamente sul pavimento senza metterla prima in un contenitore. Questo funziona bene se stai solo scaricando spazzatura. Ma qui, il robot deve mescolare la sabbia, il che significa che deve raccoglierla di nuovo. Scaricarla direttamente ha fatto sì che il robot inciampasse sui propri piedi, facendo crollare la sua velocità in un misero 1,24 GFLOPS.
  • Il Sovraccarico "8-Righe": Come menzionato, cercare di tenere 8 righe di sabbia ha causato al robot di far cadere così tanta sabbia da passare più tempo a raccoglierla che a muoverla.

Quanto Siamo Sicuri?

L'articolo è molto fiducioso in questi numeri perché sono stati misurati, non solo indovinati. Lucas ha eseguito il codice 15 volte per ogni strategia, scartando le esecuzioni più veloci e quelle più lente (per evitare strani glitch del computer) e facendo la media delle restanti. Ha anche controllato la matematica rispetto a una versione semplice e lenta per assicurarsi che la versione veloce non barasse.

Ha persino costruito un modello di "pre-filtro" matematico — una sorta di palla di cristallo — per prevedere la velocità di una strategia prima di eseguirla effettivamente. Questa palla di cristallo è stata piuttosto brava, arrivando entro l'11,3% della velocità reale per la maggior parte delle strategie. Tendeva a essere un po' conservativa, prevedendo che la migliore strategia sarebbe stata di 78,1 GFLOPS, ma quando l'hanno eseguita davvero, ha raggiunto gli 85,30 GFLOPS.

La Conclusione

Questo articolo dimostra che non serve essere un mago che scrive codice in "linguaggio assembly" (la lingua nativa del robot) per ottenere una velocità incredibile. Usando strumenti standard (intrinsici C++) e sintonizzando attentamente i "passi di danza" (blocking, chaining e packing), si può portare il proprio computer a correre al 63,5% della sua velocità massima teorica.

La lezione principale? Non tirare a indovinare. Ciò che funziona per un tipo di robot (o chip per computer) potrebbe rompere un altro. Lucas ha testato 28 diverse combinazioni per trovare quella che funzionava, dimostrando che a volte i trucchi "ovvi" (come guardare avanti o scaricare direttamente) sono in realtà le mosse sbagliate.

Sommerso dagli articoli nel tuo campo?

Ricevi digest giornalieri degli articoli più recenti corrispondenti alle tue parole chiave di ricerca — con riassunti tecnici, nella tua lingua.

Prova Digest →