2015-04-05 19 views
5

Sto cercando di lavorare su 4000 matrici di dimensioni fisse (3x3, 4x4), facendo cose come inversione di matrice e composizione elettronica.Utilizzo di molte matrici di dimensioni fisse nei kernel CUDA

Mi sembra il modo migliore per parallelizzare questo sarebbe lasciare che ciascuno dei numerosi thread GPU funzioni su una singola istanza del problema.

Esiste un modo ragionevole per farlo? Ho letto: http://www.culatools.com/blog/2011/12/09/batched-operations/ ma, per quanto posso dire, è sempre qualcosa su cui "si sta lavorando" senza soluzione in vista. Tre anni dopo, spero che ci sia una buona soluzione.

Finora, ho guardato:

  • Utilizzando Eigen nei kernel CUDA: http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html. Ma questo è nella sua infanzia: quindi, non sembra funzionare bene e alcune cose non sono implementate. Inoltre, non sono sicuro che sia ottimizzato per CUDA. Non c'è quasi nessuna documentazione e l'unico esempio di codice è un file di test (eigen/test/cuda_basic.cu). Quando ho provato ad usare Eigen nei kernel CUDA, le cose semplici come dichiarare uno Eigen::MatrixXf in un kernel non sopravvivevano alla compilazione con nvcc V7.0.27 e Eigen 3.2.90 (mercuriale).
  • Utilizzo della libreria API del dispositivo cuBLAS per eseguire le routine BLAS all'interno di un kernel. Sembra che cuBLAS e il suo ilk siano scritti per essere parallelizzati anche per piccole matrici, il che sembra eccessivo e probabilmente lento per le matrici 3x3 e 4x4 a cui sono interessato. Inoltre, non sono sicuro che ci sia qualcosa come cuBLAS che può anche fare eigendecomposition o SVD. (Per quanto ne so, CULA non supporta la chiamata delle sue routine all'interno dei kernel).
  • Kernel di elaborazione batch che utilizzano flussi CUDA. Nella sezione 2.1.7 "Nucleo di batch" della documentazione di cuBLAS per CUDA Toolkit v7.0, questo è suggerito. Ma "" "in pratica non è possibile avere più di 16 kernel contemporanei che eseguono contemporaneamente" "" e di conseguenza sarebbe terribile per l'elaborazione di 4000 piccole matrici. In un link sopra citato al post del blog CULA, cito, "" "In teoria, si potrebbe usare un flusso CUDA per problema e lanciare un problema alla volta.Questo sarebbe mal riuscito per due motivi. il numero di thread per blocco sarebbe troppo basso, [...] In secondo luogo, il sovraccarico sostenuto dall'avvio di migliaia di operazioni in questo modo sarebbe inaccettabile, perché il codice di lancio è costoso (se non più costoso) in quanto semplicemente performante la matrice sulla CPU. "" "
  • Implementazione della mia propria moltiplicazione di matrice e composizione elettronica nei kernel. È probabile che sia molto lento e potrebbe anche richiedere molto tempo per essere implementato.

A questo punto sono tentato di rinunciare a farlo sulla GPU. È un peccato, poiché speravo in prestazioni in tempo reale per un algoritmo che richiedesse l'inversione di 4000 matrici 3x3 circa 100 volte ogni 0,1 secondi.

+0

Ho lo stesso problema: analisi eigen per molte piccole matrici 3x3. Sarebbe bello vedere qualche soluzione gpu. Bel post. –

risposta

3

Le funzioni del cubo getrfBatched e getriBatched sono progettate per l'inversione batch di piccole matrici. Questo dovrebbe essere più veloce rispetto al parallelismo o agli stream dinamici (il 2 ° e il 3 ° approccio). È anche disponibile un risolutore batch in source code form che può eseguire inversioni di matrice. Per accedere a questo link è necessario accedere come sviluppatore registrato su developer.nvidia.com.

Inoltre, non sono sicuro se c'è qualcosa come cuBLAS che può anche fare la composizione elettronica o SVD. (Per quanto ne so, CULA non supporta la chiamata delle sue routine all'interno dei kernel).

Cusolver fornisce alcuni eigen solver functions.Tuttavia, non sono in batch né chiamabili dal codice del dispositivo, quindi ti trovi di fronte agli stream come unica opzione oltre a questo.