Ho sviluppato una funzione ingenua per il mirroring di un'immagine in orizzontale o verticale utilizzando CUDA C++.Le funzioni NPP non sono completamente ottimizzate?
Poi ho scoperto che la libreria NVIDIA Performance Primitives offre anche una funzione per il mirroring delle immagini.
Solo per ragioni di confronto, ho programmato la mia funzione rispetto all'NPP. Sorprendentemente, la mia funzione ha sovraperformato (anche se con un piccolo margine, ma ancora ...).
Ho confermato i risultati più volte utilizzando il timer di Windows e il timer CUDA.
La mia domanda è: Le funzioni NPP non sono completamente ottimizzate per le GPU NVIDIA?
Utilizzo CUDA 5.0, GeForce GTX460M (Compute 2.1) e Windows 8 per lo sviluppo.
Qual era la differenza, in percentuale? Le operazioni di mirroring saranno vincolate alla memoria e i dispositivi più recenti saranno flessibili nei tipi di modelli di accesso alla memoria che gestiranno in modo efficiente. Un'implementazione ingenua potrebbe essere vicina a quella ottimale sui nuovi dispositivi. Forse la versione NPP funziona meglio per i dispositivi più vecchi. Puoi ottenere le statistiche della larghezza di banda della memoria per il tuo kernel dal profiler e confrontarle al massimo per il tuo dispositivo. –
Ho testato 4 tipi di immagini e 2 diverse dimensioni. 8 bit, 16 bit, 1 canale, 3 canali, (1280 x 720), (1920 x 1080). Ho ottenuto la massima velocità con l'immagine a 16 bit del singolo canale (1280 x 720), che era più veloce del 18,75% rispetto all'NPP. – sgarizvi
Hai ragione quando mancano le prestazioni della NPP. Ho trovato librerie migliori là fuori per l'elaborazione delle immagini CUDA. Personalmente mi piace la selezione di elaborazione delle immagini di ArrayFire e ho trovato che è veloce, http://www.accelereyes.com/arrayfire/c/group__image__mat.htm Altre persone hanno segnalato l'uso delle funzionalità GPU di OpenCV, anche se non ho sentito grandi cose a tale proposito. Anche Tunacode in Pakistan ha qualcosa. –