0Pricing
CUDA Academy · Lezione

Suddividere il prodotto interno in tile

Carichi sotto-tile di A e B per ogni fase.

Suddividere il prodotto interno in tile è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento CUDA Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso CUDA Academy include 4 lezioni in totale.

L’idea del tiling

Il tiling suddivide le matrici in piccoli tile quadrati che entrano nella memoria veloce on-chip. I thread collaborano per caricare un tile una volta e riutilizzarlo molte volte.

Perché usare la memoria condivisa

Un tile risiede nella memoria __shared__, visibile a ogni thread del blocco. Leggerlo è molto più veloce che accedere ripetutamente alla memoria globale. ⚡

__shared__ float As[TILE][TILE];
__shared__ float Bs[TILE][TILE];

Un blocco, un tile di output

Ogni blocco è responsabile di una porzione dell’output C di dimensioni TILE per TILE. I suoi thread collaborano per calcolare insieme l’intera porzione.

La dimensione del tile corrisponde al blocco

Si sceglie TILE uguale alla larghezza del blocco, spesso 16 o 32. In questo modo ogni thread carica esattamente un elemento di ogni tile.

#define TILE 16
dim3 threads(TILE, TILE);

Associare il thread alla posizione nel tile

All’interno del tile, la posizione del thread è semplicemente il suo threadIdx. La riga e la colonna globali derivano ancora dagli indici del blocco e del thread.

int ty = threadIdx.y, tx = threadIdx.x;
int row = blockIdx.y*TILE + ty;
int col = blockIdx.x*TILE + tx;

Caricare un tile di A

Ogni thread copia un elemento del tile corrente di A nella memoria condivisa. Insieme, i thread del blocco preparano un blocco di A completo, di dimensioni TILE per TILE.

As[ty][tx] = A[row*N + (phase*TILE + tx)];

Caricare un tile di B

Contemporaneamente, ogni thread carica un elemento del tile di B. Ora entrambi i tile risiedono on-chip, pronti per letture ripetute e veloci.

Bs[ty][tx] = B[(phase*TILE + ty)*N + col];

Sincronizzarsi prima del calcolo

Chiami __syncthreads() affinché ogni thread termini il caricamento prima che qualcuno legga il tile. Saltare questo passaggio produce risultati errati.

__syncthreads();

Calcolare sul tile

Ora ogni thread esegue un breve ciclo sul tile, leggendo soltanto dalla memoria condivisa. Queste letture sono molto meno costose di quelle dalla memoria globale.

for (int k = 0; k < TILE; ++k)
  sum += As[ty][k] * Bs[k][tx];

Il vantaggio del riutilizzo

Ogni valore caricato viene usato da TILE thread anziché da uno solo. Questo riutilizzo dei dati è il motivo per cui il matmul con tiling è così veloce.

Un solo tile non basta

Un singolo tile copre solo una parte del prodotto scalare. Si ripetono i passaggi di caricamento, sincronizzazione e calcolo attraverso molte fasi, che verranno trattate nella lezione successiva.

Verifica rapida

Ricordi l’ordine dei passaggi quando si lavora con un tile condiviso.

Riepilogo

Ha caricato i tile di A e B nella memoria condivisa, si è sincronizzato e ha eseguito il calcolo con letture on-chip poco costose. Il vantaggio sta nel riutilizzo. Le fasi vengono dopo. 🧱

Domande Frequenti

La lezione «Suddividere il prodotto interno in tile» è gratuita?

Sì — il testo completo di «Suddividere il prodotto interno in tile» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso CUDA Academy, passa a CoddyKit PRO. Il corso CUDA Academy include 4 lezioni in totale.

Cosa imparerò in «Suddividere il prodotto interno in tile»?

Carichi sotto-tile di A e B per ogni fase. Eserciti CUDA Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare CUDA Academy?

Non è richiesta alcuna esperienza precedente. CUDA Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Suddividere il prodotto interno in tile»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione CUDA Academy?

Sì. Ogni lezione CUDA Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il kernel matmul ingenuo
  2. Suddividere il prodotto interno in tile
  3. Iterare sulle fasi dei tile
  4. Misurare l'incremento di velocità
← Torna a CUDA Academy