Domanda

Sono certa familiarità con il profiler visivo CUDA e il foglio di calcolo di occupazione, anche se sto probabilmente non li sfruttando così come ho potuto. Profiling e l'ottimizzazione del codice CUDA non è come profiling e il codice ottimizzazione che gira su una CPU. Quindi spero di imparare dalle vostre esperienze su come ottenere il massimo dal mio codice.

C'è stato un post recente ricerca di codice più veloce possibile per identificare numeri auto , e ho fornito un implementazione CUDA . Io non sono convinto che questo codice è veloce come può essere, ma io sono in perdita per capire sia ciò che le domande giuste e quali strumenti posso ottenere le risposte da.

Come si fa a identificare i modi per rendere il vostro kernel CUDA eseguire più velocemente?

È stato utile?

Soluzione

Se si sta sviluppando su Linux quindi Visual Profiler CUDA fornisce un intero carico di informazioni, sapere cosa fare con esso può essere un po 'difficile. In Windows è anche possibile utilizzare Visual Profiler CUDA, o (su Vista / 7/2008) è possibile utilizzare Nexus che si integra perfettamente con Visual Studio e fornisce informazioni host e profilo GPU combinata.

Una volta che hai i dati, è necessario sapere come interpretarlo. Il rel="nofollow presentazione avanzata CUDA C da GTC ha alcuni consigli utili. Le cose principali da guardare fuori per sono:

  • ottimale della memoria accessi: è necessario sapere che cosa vi aspettate il vostro codice di fare e quindi cercare le eccezioni. Quindi, se siete sempre caricando carri allegorici, e ogni thread carica un galleggiante diverso da un array, allora ci si aspetterebbe di vedere un sacco solo 64 byte (sulle attuali h / w). Eventuali altri carichi sono inefficienti. Le informazioni di profilazione probabilmente migliorerà in futuro h / w.
  • Riduci serializzazione: il contatore "ordito serializzare" indica che avete condiviso i conflitti di memoria o la costante serializzazione, la presentazione va in modo più dettagliato e cosa fare su questo, come fa l'SDK (ad esempio il campione riduzione)
  • Sovrapposizione di I / O e di calcolo: è qui che Nexus brilla davvero (è possibile ottenere le stesse informazioni utilizzando manualmente cudaEvents), se si dispone di una grande quantità di dati trasferire si desidera sovrapporre il calcolo e l'I / O
  • configurazione Esecuzione: la calcolatrice occupazione può aiutare con questo, ma i metodi semplici come commentando il calcolo per misurare previsto vs banda misurata è molto utile (e viceversa per il throughput calcolare)

Questo è solo l'inizio, controlla la presentazione CG e alle webinar sul sito web NVIDIA.

Altri suggerimenti

Il profiler CUDA è piuttosto grezzo e non fornisce un sacco di informazioni utili. L'unico modo per seriamente micro-ottimizzare il codice (Supponendo di aver già scelto il migliore algoritmo possibile) è di avere una profonda comprensione dell'architettura GPU, in particolare per uso della memoria condivisa, modelli di accesso di memoria esterni, registrati utilizzo occupazione filo , fili di ordito, ecc.

Forse si potrebbe pubblicare il tuo codice del kernel qui e ottenere un feedback?

Il forum degli sviluppatori nVidia CUDA forum è anche un buon posto dove andare per aiutare con questo tipo di problema.

Se si utilizza Windows ... Arrivo Nexus:

http://developer.nvidia.com/object/nexus.html

ho appeso indietro perché io non sono esperto CUDA, e le altre risposte sono piuttosto buone se il codice è già abbastanza vicino ottimale. Nella mia esperienza, questo è un grande se, e non c'è nulla di male nel verificarla.

Per verificarlo, è necessario scoprire se il codice è di sicuro non fare nulla in realtà non hanno a che fare. Qui ci sono modi che posso vedere per verificare che:

  • Eseguire lo stesso codice sul processore di vaniglia, e prendere stackshots di esso, o utilizzare un profiler come Oprofile o RotateRight / Zoom che può darvi informazioni equivalenti.

  • L'esecuzione su un processore CUDA, e facendo la stessa cosa, se possibile.

Quello che stai cercando sono linee di codice che hanno alta occupazione nello stack di chiamate, come dimostra la frazione di campioni dello stack che li contengono. Quelli sono i tuoi "colli di bottiglia". Non ci vuole un gran numero di campioni per individuarli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top