2010-05-19 16 views
6

Prima di tutto:Che tipo di benifits lavoro da OpenCL

  • Sono ben consapevole che OpenCL non magicamente rendere tutto più veloce
  • Sono ben consapevole che OpenCL ha dei limiti

Così ora alla mia domanda, sono abituato a fare diversi calcoli scientifici usando la programmazione. Alcune delle cose su cui lavoro sono piuttosto intense per quanto riguarda la complessità e il numero di calcoli. Quindi mi stavo chiedendo, forse potrei accelerare le cose con OpenCL.

Allora, che cosa mi piacerebbe sentire da tutti voi è risposte ad alcune delle seguenti [bonus per i link]:

* Che tipo di calcoli/algoritmi/problemi generali è adatto per OpenCL

* Quali sono le linee guida generali per determinare se un particolare codice potrebbe trarre vantaggio dalla migrazione a OpenCL?

saluti

risposta

9

Penso che questa sia una buona domanda, ed è qualcosa che sto cercando di elaborare anche per la mia ricerca.

Al momento vi sono forti limitazioni in termini di ciò che le GPU possono fare, poiché richiedono singoli thread per eseguire esattamente lo stesso codice su diversi set di dati, cioè il problema/l'algoritmo deve essere "parallelo dati". Ovviamente i problemi paralleli tra i dati includono le simulazioni Monte Carlo (dove molte simulazioni MC sono eseguite in parallelo), l'elaborazione delle immagini e meno ovviamente le simulazioni di dinamica molecolare. L'integrazione numerica (Monte Carlo o altro) è un'altra applicazione scientifica che può essere facilmente portata su una GPU.

L'altra restrizione principale è che la memoria per thread è molto limitata e quindi per essere eseguita in modo efficiente su una GPU l'algoritmo deve avere un'intensità aritmetica elevata. Una condizione necessaria ma non sufficiente perché un algoritmo possa candidarsi per l'esecuzione su una GPU è che sulla CPU l'algoritmo deve essere fortemente vincolato alla CPU anziché legato alla memoria.

Il mio punto di vista è che col passare del tempo, sempre più problemi verranno risolti in modo da poter essere risolti utilizzando questo paradigma solo perché c'è un così grande guadagno di prestazioni da fare, ma il frutto basso è ovviamente problemi di dati paralleli. A mio avviso, la programmazione massiccia multicore è destinata a diventare sempre più importante e prevalente nei circoli scientifici nel prossimo decennio.

Ho giocato un po 'con questo e sono riuscito a calzare un problema di backtracking in un formato appropriato per l'esecuzione su una GPU (usando CUDA). Cordiali saluti, descrivo questo in un discorso: http://lattice.complex.unimelb.edu.au/home/sites/default/files/mydocuments/clisby_cuda0509.pdf

3

E 'adatto per compiti che possono essere espressi come un po piccolo programma che lavorano in parallelo su grandi blocchi di semplici strutture di dati.

Se vuoi calcolare la differenza tra due immagini, OpenCL fa per te. Se vuoi eseguire il ray-trace di una scena, è piuttosto difficile ma ancora fattibile. Se hai risposto a grandi quantità di richieste di servizi web, OpenCL non è la soluzione.

2

Per quanto riguarda gli algoritmi devono essere dati paralleli. Quello è un dato di set non dovrebbe avere dipendenze su serie precedenti. Per disegnare un'analogia, considera l'ordinamento di inserimento in cui un elemento viene confrontato con altri elementi per trovare la giusta posizione.Questo è "non" i dati paralleli poiché ogni passo deve accedere agli elementi N-1. Ora, se hai bisogno di ordinare usando openCL, dovresti implementare l'ordinamento bitonale che è un tipo di rete di smistamento.

Anche se sono dati paralleli, c'è la questione del compromesso tra FLOP e latenze di memoria. se ogni dato deve essere recuperato dalla memoria globale, il miglioramento delle prestazioni potrebbe non essere significativo. Le latenze di memoria della GPU sono di gran lunga superiori a quelle della CPU. Per contrastare questo, ci sono memorie locali in GPU che possono essere utilizzate.