CUDA Academy · Lezione

Progettare la pipeline di elaborazione

Fasi, buffer e flusso dei dati

Lezione 1 di 413 passaggi

Progettare la pipeline di elaborazione è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Ragionare per fasi

Una vera pipeline di immagini è una catena di fasi: caricamento, sfocatura, nitidezza, correzione del colore e salvataggio. Ogni fase è una trasformazione chiara che può analizzare singolarmente. 🧩

I dati fluiscono in una sola direzione

I pixel avanzano nella pipeline: ogni fase legge l'output della fase precedente e produce l'input per quella successiva. Questo flusso di dati unidirezionale rende il progetto più semplice da seguire.

I buffer contengono i dati intermedi

Tra due fasi serve uno spazio in cui conservare i pixel. Un buffer è semplicemente un array del device in cui un kernel scrive e dal quale il kernel successivo legge. Preveda un buffer per ogni confine.

float* d_stage1;
cudaMalloc(&d_stage1, width * height * sizeof(float));

Alternare due buffer

Raramente serve un buffer nuovo per ogni fase. Alterni due buffer con il metodo ping-pong: legga da uno, scriva nell'altro, quindi li scambi. Due buffer sono sufficienti per un'intera catena.

std::swap(d_in, d_out);

Un kernel per fase, per ora

Inizi con un kernel per ogni fase. È il progetto più chiaro e più semplice da verificare. In seguito potrà fondere le fasi, quando ciascuna funzionerà correttamente.

Associare i pixel ai thread

L'associazione naturale è un thread per pixel. Una griglia 2D copre larghezza e altezza, quindi ogni thread gestisce esattamente una posizione (x, y).

int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;

Indicizzare usando il passo di riga

Le immagini sono memorizzate riga per riga. Trasformi (x, y) in un offset lineare usando l'indicizzazione row-major, così ogni thread legge il pixel corretto.

int idx = y * width + x;

Proteggere i bordi dell'immagine

La griglia viene arrotondata per eccesso, quindi alcuni thread si trovano fuori dall'immagine. Un semplice controllo dei limiti impedisce loro di accedere a memoria che non dovrebbero toccare.

if (x >= width || y >= height) return;

Scegliere la forma del blocco 2D

Un blocco come 16x16 o 32x8 offre una buona copertura e righe adatte ai warp. Quando possibile, scelga una forma di blocco 2D che si adatti perfettamente alle dimensioni dell'immagine.

dim3 block(16, 16);
dim3 grid((width+15)/16, (height+15)/16);

Allocare una volta e riutilizzare spesso

Allocare memoria del device è costoso, quindi lo faccia una sola volta prima del ciclo. Riutilizzi gli stessi buffer per ogni fotogramma invece di eseguire malloc e free ogni volta.

Progettare prima di scrivere il codice

Disegni prima le fasi, i relativi buffer e le frecce che li collegano. Un diagramma chiaro del flusso di dati permette di individuare gli errori di progettazione molto prima dell'esecuzione di qualsiasi kernel. ✏️

Controllo rapido

Ha una catena di fasi. Come può evitare di allocare un nuovo buffer per ogni fase?

Riepilogo

Ha progettato una pipeline composta da stadi unidirezionali collegati da buffer, ha associato un thread a ogni pixel usando una griglia 2D e ha imparato a scambiare i buffer alternativamente, abbozzando prima il flusso. 🎯

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Progettare la pipeline di elaborazione» è gratuita?

Sì — il testo completo di «Progettare la pipeline di elaborazione» è 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 «Progettare la pipeline di elaborazione»?

Fasi, buffer e flusso dei dati 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 1 di 4.

Quanto tempo richiede la lezione «Progettare la pipeline di elaborazione»?

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. Progettare la pipeline di elaborazione
  2. Fondere i filtri in un unico kernel
  3. Elaborare tile in streaming per immagini grandi
  4. Profilare, ottimizzare, distribuire
← Torna a CUDA Academy