Domanda

Sono interessato a sapere se qualcuno ha scritto un'applicazione che sfrutta a GPGPU utilizzando, ad esempio, nVidia CUDA.Se sì, quali problemi hai riscontrato e quali miglioramenti in termini di prestazioni hai ottenuto rispetto a una CPU standard?

È stato utile?

Soluzione

Ho sviluppato GPGPU con SDK di flusso di ATI al posto di Cuda.Il tipo di miglioramento delle prestazioni che otterrai dipende da a quantità di fattori, ma il più importante è l’intensità numerica.(Ovvero, il rapporto tra le operazioni di calcolo e i riferimenti alla memoria.)

Una funzione BLAS di livello 1 o BLAS di livello 2 come l'aggiunta di due vettori esegue solo 1 operazione matematica per ogni 3 riferimenti di memoria, quindi il NI è (1/3).Questo viene sempre eseguito Più lentamente con CAL o Cuda piuttosto che limitarsi a farlo sulla CPU.Il motivo principale è il tempo necessario per trasferire i dati dalla CPU alla GPU e viceversa.

Per una funzione come FFT, ci sono calcoli O(N log N) e riferimenti di memoria O(N), quindi NI è O(log N).Se N è molto grande, diciamo 1.000.000, probabilmente sarà più veloce farlo sulla GPU;Se N è piccolo, diciamo 1.000, sarà quasi certamente più lento.

Per una funzione BLAS di livello 3 o LAPACK come la scomposizione LU di una matrice o la ricerca dei suoi autovalori, ci sono calcoli O (N ^ 3) e riferimenti di memoria O (N ^ 2), quindi NI è O (N).Per array molto piccoli, supponiamo che N sia qualche punteggio, sarà comunque più veloce da eseguire sulla CPU, ma all'aumentare di N, l'algoritmo passa molto rapidamente da legato alla memoria a legato al calcolo e l'aumento delle prestazioni sulla GPU aumenta molto velocemente.

Tutto ciò che coinvolge l'aritmetica complessa ha più calcoli dell'aritmetica scalare, che di solito raddoppia l'NI e aumenta le prestazioni della GPU.


(fonte: Earthlink.net)

Ecco le prestazioni di CGEMM: complessa moltiplicazione matrice-matrice a precisione singola eseguita su una Radeon 4870.

Altri suggerimenti

Ho scritto applicazioni banali, aiuta davvero se riesci a paralizzare i calcoli in virgola mobile.

Ho trovato molto utile il seguente corso tenuto da un professore Urbana Champaign dell'Università dell'Illinois e da un ingegnere NVIDIA quando ho iniziato: http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (include le registrazioni di tutte le lezioni).

Ho utilizzato CUDA per diversi algoritmi di elaborazione delle immagini.Queste applicazioni, ovviamente, sono molto adatte per CUDA (o qualsiasi paradigma di elaborazione GPU).

Secondo me, ci sono tre fasi tipiche durante il porting di un algoritmo su CUDA:

  1. Trasferimento iniziale: Anche con una conoscenza di base di CUDA, puoi trasferire semplici algoritmi in poche ore.Se sei fortunato, guadagni un fattore da 2 a 10 in termini di prestazioni.
  2. Ottimizzazioni banali: Ciò include l'utilizzo di trame per i dati di input e il riempimento di array multidimensionali.Se hai esperienza, questo può essere fatto in un giorno e potrebbe darti un altro fattore 10 in termini di prestazioni.Il codice risultante è ancora leggibile.
  3. Ottimizzazioni fondamentali: Ciò include la copia dei dati nella memoria condivisa per evitare la latenza della memoria globale, il capovolgimento del codice per ridurre il numero di registri utilizzati, ecc.Puoi trascorrere diverse settimane con questo passaggio, ma nella maggior parte dei casi il miglioramento delle prestazioni non ne vale la pena.Dopo questo passaggio, il tuo codice sarà così offuscato che nessuno lo capirà (compreso te).

Questo è molto simile all'ottimizzazione di un codice per le CPU.Tuttavia, la risposta di una GPU alle ottimizzazioni delle prestazioni è ancora meno prevedibile rispetto a quella delle CPU.

Utilizzo GPGPU per il rilevamento del movimento (originariamente utilizzando CG e ora CUDA) e la stabilizzazione (utilizzando CUDA) con elaborazione delle immagini.In queste situazioni ho ottenuto un aumento di velocità di circa 10-20 volte.

Da quello che ho letto, questo è abbastanza tipico per gli algoritmi paralleli ai dati.

Anche se non ho ancora alcuna esperienza pratica con CUDA, ho studiato l'argomento e ho trovato una serie di articoli che documentano risultati positivi utilizzando le API GPGPU (tutti includono CUDA).

Questo carta descrive come i join di database possono essere parallelizzati creando una serie di primitive parallele (map, scatter, raccolte ecc.) che possono essere combinate in un algoritmo efficiente.

In questo carta, viene creata un'implementazione parallela dello standard di crittografia AES con una velocità paragonabile a quella dell'hardware di crittografia discreto.

Infine, questo carta analizza il modo in cui CUDA si applica a una serie di applicazioni come griglie strutturate e non strutturate, logica di combinazione, programmazione dinamica e data mining.

Ho implementato un calcolo Monte Carlo in CUDA per qualche uso finanziario.Il codice CUDA ottimizzato è circa 500 volte più veloce di un'implementazione CPU multi-thread "avrei potuto provare di più, ma non proprio".(Confronto tra una GeForce 8800GT e una Q6600 qui).È risaputo però che i problemi di Monte Carlo sono imbarazzanti e paralleli.

I principali problemi riscontrati riguardano la perdita di precisione dovuta alla limitazione dei chip G8x e G9x ai numeri in virgola mobile a precisione singola IEEE.Con il rilascio dei chip GT200 questo problema potrebbe essere mitigato in una certa misura utilizzando l'unità a doppia precisione, a scapito di alcune prestazioni.Non l'ho ancora provato.

Inoltre, poiché CUDA è un'estensione C, integrarla in un'altra applicazione può non essere banale.

Ho implementato un algoritmo genetico sulla GPU e ho ottenuto accelerazioni di circa 7...Sono possibili maggiori guadagni con una maggiore intensità numerica, come ha sottolineato qualcun altro.Quindi sì, i vantaggi ci sono, se l’applicazione è corretta

Ho scritto un kernel di moltiplicazione di matrici con valori complessi che batteva l'implementazione di cuBLAS di circa il 30% per l'applicazione per cui lo stavo usando, e una sorta di funzione di prodotto esterno vettoriale che eseguiva diversi ordini di grandezza rispetto a una soluzione di moltiplicazione e traccia per il resto di il problema.

Era un progetto dell'ultimo anno.Mi ci è voluto un anno intero.

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

Ho implementato la fattorizzazione di Cholesky per risolvere grandi equazioni lineari su GPU utilizzando ATI Stream SDK.Le mie osservazioni erano

alt text

Ha ottenuto un aumento delle prestazioni fino a 10 volte.

Lavorando sullo stesso problema per ottimizzarlo maggiormente, scalandolo su più GPU.

SÌ.Ho implementato il Filtro a diffusione anisotropica non lineare utilizzando l'API CUDA.

È abbastanza semplice, poiché è un filtro che deve essere eseguito in parallelo data un'immagine di input.Non ho incontrato molte difficoltà su questo, poiché richiedeva solo un semplice kernel.L'accelerazione era di circa 300x.Questo è stato il mio progetto finale su CS.Il progetto può essere trovato Qui (è scritto in portoghese tu).

Ho provato a scrivere il Mumford&Shah anche l'algoritmo di segmentazione, ma è stata una seccatura scriverlo, dal momento che CUDA è ancora agli inizi e quindi accadono molte cose strane.Ho anche notato un miglioramento delle prestazioni aggiungendo un file if (false){} nel codice O_O.

I risultati di questo algoritmo di segmentazione non erano buoni.Ho avuto una perdita di prestazioni di 20 volte rispetto all'approccio CPU (tuttavia, poiché si tratta di una CPU, si potrebbe adottare un approccio diverso che abbia prodotto gli stessi risultati).È ancora un lavoro in corso, ma sfortunatamente ho lasciato il laboratorio su cui stavo lavorando, quindi forse un giorno potrei finirlo.

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