2012-09-14 22 views
9

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.

+0

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. –

+0

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

+1

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. –

risposta

9

rischio di non ottenere voti pubblicando questa risposta. :)

NVIDIA lavora continuamente per migliorare tutte le nostre librerie CUDA. NPP è una libreria particolarmente grande, con oltre 4000 funzioni da mantenere. Abbiamo un obiettivo realistico di fornire alle biblioteche un'utile velocità su un equivalente CPU, che sono testate su tutte le nostre GPU e sistemi operativi supportati e che sono attivamente migliorate e mantenute. La funzione in questione (Mirror), è un noto problema di prestazioni che miglioreremo in una versione futura. Se hai bisogno di una particolare funzione ottimizzata, il modo migliore per ottenerne la priorità è archiviare un bug RFE (Request for Enhancement) utilizzando il modulo di invio bug disponibile per NVIDIA CUDA registered developers.

Per inciso, non credo che nessuna libreria possa mai essere "completamente ottimizzata". Con una grande libreria per supportare una base hardware ampia e in crescita, il lavoro per ottimizzarlo non è mai stato fatto! :)

Incoraggiamo le persone a continuare a cercare di superare le librerie NVIDIA, perché nel complesso migliora lo stato dell'arte e migliora l'ecosistema di elaborazione.

+3

Come una parte ... è probabilmente sicuro di dire che, con un tempo e uno sforzo sufficienti, è generalmente possibile battere le funzioni della libreria in termini di prestazioni non elaborate. Le biblioteche tipicamente fanno meno ipotesi in modo che siano più ampiamente applicabili. Quando esegui il rollover, puoi utilizzare tutte le ipotesi specifiche della tua situazione per accelerare le cose.Un esempio che viene in mente (non GPGPU, ma probabilmente si applica la stessa idea) è nell'ordinamento. Non è difficile battere i metodi di ordinamento standard, se si conoscono molti dati e sono disposti a inserire tali presupposti nel codice. – Patrick87

Problemi correlati