CUDA Academy · Lezione

printf dentro un kernel

Visualizzi l'output dei thread device.

Lezione 3 di 413 passaggi

printf dentro un kernel è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 3 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.

Stampare dalla GPU

Incredibile ma vero: potete chiamare printf direttamente all’interno di un kernel. È il modo più semplice per dare un’occhiata a ciò che fanno i vostri thread. 👀

__global__ void hi() {
    printf("Hello from the GPU\n");
}

Ogni thread stampa

Ricordate che il kernel viene eseguito in ogni thread, quindi una singola riga printf viene eseguita una volta per thread. Se avviate 256 thread, otterrete 256 righe.

hi<<<1, 256>>>(); // 256 hellos

Identificare ogni thread

Includete threadIdx nel messaggio per distinguere i thread. Altrimenti l’output sarà solo un muro di righe identiche.

printf("thread %d\n", threadIdx.x);

L’ordine dell’output non è fisso

I thread vengono eseguiti in parallelo, quindi l’ordine delle stampe è imprevedibile. Non fate affidamento sul fatto che le righe arrivino nella sequenza degli indici.

Le stringhe di formato funzionano

Il printf del device supporta i consueti specificatori di formato, come %d, %f e %s. Funziona proprio come il printf dell’host.

printf("i=%d val=%f\n", i, x[i]);

L’output viene inviato a un buffer

L’output del device viene accumulato in un buffer della GPU e trasferito in seguito alla console, non nell’istante in cui viene eseguito printf. È normale.

Dovete attendere per vederlo

Poiché l’avvio è asincrono, non vedrete le stampe finché la GPU non avrà terminato. Chiamate cudaDeviceSynchronize per svuotare il buffer.

hi<<<1, 4>>>();
cudaDeviceSynchronize();

Limitare le stampe pesanti

Stampare da milioni di thread riempie il buffer. Usate una condizione in modo che stampi solo il thread 0, oppure soltanto pochi thread.

if (threadIdx.x == 0) printf("block done\n");

Ottimo per il debugging rapido

printf è il vostro strumento di debugging più rapido: inseritene uno per controllare un indice o un valore, confermare il problema e poi rimuoverlo.

printf("i=%d should be < n=%d\n", i, n);

Rallenta i kernel

Stampare molto danneggia gravemente le prestazioni. Usate questa tecnica per trovare un problema, poi eliminatela prima di misurare la velocità effettiva.

Le vecchie GPU possono comportarsi diversamente

Il printf del device richiede una compute capability abbastanza moderna (2.0 o superiore). Quasi tutte le GPU attuali lo supportano senza problemi.

Verifica rapida

Verificate che cosa sapete sul printf del device.

Riepilogo: printf del kernel

Usate printf per dare un’occhiata all’interno dei thread, aggiungete threadIdx per distinguerli, sincronizzate per svuotare il buffer e rimuovetelo prima di cronometrare. Uno strumento davvero utile! 🎉

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 «printf dentro un kernel» è gratuita?

Sì — il testo completo di «printf dentro un kernel» è 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 «printf dentro un kernel»?

Visualizzi l'output dei thread device. 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 3 di 4.

Quanto tempo richiede la lezione «printf dentro un kernel»?

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. Anatomia di un kernel
  2. L'avvio con tripla parentesi angolare
  3. printf dentro un kernel
  4. Spiegazione di cudaDeviceSynchronize
← Torna a CUDA Academy