2012-07-29 20 views
8

Sto tentando di ottimizzare un'applicazione nella modellazione 3D in tempo reale. La parte di calcolo dell'applicazione viene eseguita quasi interamente sulla GPU in CUDA. L'applicazione richiede la soluzione di un piccolo (6x6) sistema lineare definito positivo simmetrico a doppia precisione Ax = b 500+ volte al secondo. Attualmente questo viene fatto con un'efficiente libreria di algebra lineare basata su CPU che utilizza Cholesky ma richiede la copia di dati dalla CPU - GPU e di nuovo in GPU centinaia di volte al secondo e il sovraccarico di kernel avvia ogni volta ecc.Risolvi il piccolo simmetrico positivo definito Ax = b solo sulla GPU

Come posso calcolare la soluzione al sistema lineare sulla GPU solo senza dover prendere i dati sulla CPU? Ho letto un po 'della libreria MAGMA ma sembra che utilizzi algoritmi ibridi anziché algoritmi solo per GPU.

Sono preparato per il fatto che la soluzione di un singolo sistema lineare sulla GPU sarà molto più lenta rispetto alla libreria basata su CPU esistente, ma voglio vedere se questo può essere compensato rimuovendo la comunicazione dati tra l'host e il dispositivo e il sovraccarico di kernel avvia ecc. centinaia di volte al secondo. Se non ci sono GPU alternative LAPACK-like, come posso implementare qualcosa per risolvere questo particolare caso 6x6 solo sulla GPU? Potrebbe essere fatto senza un enorme investimento di tempo con le librerie GPU BLAS, ad esempio?

+0

Un sistema lineare 6x6 è così piccolo, che è possibile scrivere le equazioni da soli all'interno del codice CUDA ... Ovviamente per un sistema così piccolo sarebbe molto difficile ottenere alcun beneficio dalla natura parallela di CUDA, ma sbarazzarsi di la comunicazione con la GPU-CPU avrebbe davvero un enorme vantaggio. Sarebbe possibile, parallelizzare in un modo diverso? Risolvi il sistema su un singolo core GPU e quindi utilizza più core fino a 500+ soluzioni/s. Sarebbe il migliore, a meno che non hai bisogno di risultati dal sistema precedente per iniziare a lavorare su quello successivo. – Eiver

+1

@Eiver è in the money. puoi fare quelle 500 in parallelo o dipendono l'una dall'altra? per 6x6 questo approccio http://en.wikipedia.org/wiki/Cholesky_decomposition#Block_variant sembra codificabile a mano ... –

risposta

3

NVIDIA ha pubblicato il codice per un risolutore Ax = b risolutore sul sito Web dello sviluppatore registrato lo scorso autunno. Questo codice funziona per matrici generiche e dovrebbe funzionare abbastanza bene per le tue necessità, a condizione che tu possa espandere le matrici simmetriche a matrici complete (che non dovrebbe essere un problema per un 6x6?). Poiché il codice esegue la rotazione, che non è necessario per le matrici definite definite, non è ottimale per il tuo caso, ma potresti essere in grado di modificarlo per i tuoi scopi in quanto il codice è sotto una licenza BSD.

Il sito Web degli sviluppatori standard di NVIDIA sta riscontrando alcuni problemi al momento. Ecco come si può scaricare il codice risolutore raggruppati in questo momento:

(1) Vai http://www.nvidia.com/content/cuda/cuda-toolkit.html

(2) Se si dispone di un account NVdeveloper esistente (ad esempio via partners.nvidia.com) clicca sul verde "Accedi al nvdeveloper" link nella parte destra dello schermo. Altrimenti clicca su "Entra in nvdeveloper" per richiedere un nuovo account; le richieste di nuovi account vengono generalmente approvate entro un giorno lavorativo.

(3) Effettua il login al prompt con l'indirizzo email e la password

(4) c'è una sezione sul lato destro della strada dal titolo "Nuovi Downloads". Il quinto elemento dall'alto è "Batched Solver". Clicca su questo e ti porterà alla pagina di download del codice.

(5) Fare clic sul collegamento "download", quindi fare clic su "Accetta" per accettare i termini della licenza. Il tuo download dovrebbe iniziare.

+0

Grazie mille, da una prima occhiata al Risolutore Batched sembra che farà quello che sono cercando. –

+0

Ho appena fatto un'altra domanda sull'algebra lineare e le GPU di cui potresti sapere qualcosa! http://stackoverflow.com/questions/11778981/code-library-to-calculate-determinant-of-a-small-6x6-matrix-solely-on-gpu –