2012-09-29 15 views
11

Sono abbastanza nuovo per la programmazione GPU, ma dal momento che ho un compito computazionalmente intensivo, mi sono rivolto alla GPU per ottenere possibili miglioramenti delle prestazioni.ArrayFire rispetto alla programmazione CUDA raw?

Ho provato a riscrivere il mio programma con la versione ArrayFire Free. È effettivamente più veloce della mia routine CPU con multi-threading abilitato, ma non al grado che mi aspettavo (ovvero, < 100% di accelerazione) ei risultati restituiti non sono corretti (< errore dell'1% rispetto alla routine della CPU, supponendo i risultati della routine della CPU sono corretti).

Il mio compito è principalmente element-wise float-32 operazioni matematiche su matrici di grandi dimensioni (dimensioni 300MB-500MB), con pochi casi/interruttori ecc. Immagino che il collo di bottiglia delle prestazioni sia probabilmente la larghezza di banda tra CPU e GPU memoria poiché c'è molta lettura dei dati, ecc. La GPU che ho provato è una GeForce 580GTX con 3 GB di memoria video.

C'è ancora spazio significativo per l'ottimizzazione se scrivo codice CUDA grezzo (con CUBLAS ecc. E ottimizzazione media) invece di usare ArrayFire per il mio compito? Ho letto alcune guide all'ottimizzazione NVIDIA; sembra che ci siano alcuni trucchi di accesso alla memoria per un accesso ai dati più rapido e per ridurre i conflitti bancari. ArrayFire usa questi trucchi generali automaticamente o no?

risposta

16

Grazie per il post. Sono contento di sentire i primi risultati che stavano dando un po 'di accelerazione. Lavoro su ArrayFire e posso presentarmi qui per le tue domande.

Prima di tutto, il codice è davvero necessario qui per chiunque sia d'aiuto con specificità. Puoi condividere il codice che hai scritto?

In secondo luogo, dovresti pensare a CUDA e ArrayFire nel modo seguente: CUDA è un modo per programmare la GPU che ti offre la possibilità di scrivere qualsiasi codice GPU che desideri. Ma c'è un'enorme differenza tra il codice CUDA ingenuo (spesso più lento della CPU) e il codice CUDA esperto, time-staking e ottimizzato a mano. ArrayFire (e alcune altre librerie GPU come CUBLAS) hanno molti anni di ottimizzazioni versate su di loro, e in genere daranno risultati migliori di quanto la maggior parte delle persone normali abbiano il tempo di realizzare da soli. Tuttavia, c'è anche variabilità nel modo in cui qualcuno usa ArrayFire (o altre librerie). Ci sono variabili che possono e devono essere ottimizzate nell'uso delle chiamate alla libreria ArrayFire per ottenere le migliori prestazioni. Se pubblichi il tuo codice, possiamo aiutarti a condividere alcuni di questi qui.

In terzo luogo, ArrayFire utilizza CUBLAS nelle funzioni che si basano su BLAS, quindi non è probabile che vedrete molta differenza utilizzando CUBLAS direttamente.

In quarto luogo, sì, ArrayFire utilizza tutte le ottimizzazioni disponibili nella Guida alla programmazione NVIDIA CUDA per (ad esempio un trasferimento dei dati più rapido e la riduzione dei conflitti di banco di memoria come si cita). È qui che la maggior parte dello sviluppo di ArrayFire è focalizzata sull'ottimizzazione di questo genere di cose.

Infine, le discrepanze tra i dati che si notano sono probabilmente dovute a tale natura del calcolo CPU vs GPU. Dal momento che sono dispositivi diversi, spesso vedrai risultati leggermente diversi. Non è che la CPU dia risultati migliori rispetto alla GPU, ma piuttosto che stiano lavorando con quantità finite di precisione in modi leggermente diversi. Se utilizzi la precisione singola invece del doppio, potresti prenderlo in considerazione. Il codice dei post ci consentirà di aiutarci anche su questo.

Felice di espandere la mia risposta una volta che il codice è stato pubblicato.

+0

Non rispettano entrambi le specifiche IEEE? Presumo che l'utilizzo di 'Single Precision' su entrambi dovrebbe produrre lo stesso risultato. Anche in questo caso, assumere l'ordine del calcolo è lo stesso. – Royi

Problemi correlati