2011-12-30 11 views
15

Anche se si suppone che le GPU vengano utilizzate con tipi di dati in virgola mobile, sarei interessato a quanto velocemente GPU può elaborare operazioni bit a bit. Questi sono i più veloci possibile sulla CPU, ma la GPU emula operazioni bit a bit o è completamente calcolata sull'hardware? Sto pensando di usarli all'interno dei programmi shader scritti con GLSL. Suppongo anche che se le operazioni bit a bit hanno una preformance completa, anche i tipi di dati interi dovrebbero avere, ma ho bisogno di una conferma al riguardo.Prestazioni di operazioni a numero intero e bit a bit su GPU

Per essere più precisi, le versioni mirate sono OpenGL 3.2 e GLSL 1.5. L'hardware che dovrebbe funzionare è qualsiasi scheda grafica Radeon HD e GeForce serie 8 e successive .. Se ci sono alcuni cambiamenti importanti nelle versioni più recenti di OpenGL e GLSL relative all'elaborazione di velocità di operazioni/interi bit a bit, sarei felice se tu ". Li indicherò.

+0

È necessario specificare una particolare architettura GPU o almeno la versione OpenGL. In questo momento questa domanda è orribilmente vaga. –

+0

@BenVoigt aggiornato, è abbastanza preciso, o hai bisogno di un nome di codice specifico dell'architettura (li cambiano come per ogni nuova scheda) – Raven

+0

Raven: Ci sono alcuni enormi cambiamenti tra Radeon HD 1xxx e HD 7xxx, ma quella informazione extra è un grande miglioramento. Supponendo che stai guardando schede che pubblicizzano il supporto per OpenGL 3.2 (o versioni successive), questo è probabilmente abbastanza chiaro. –

risposta

8

La domanda è stata parzialmente risposto Integer calculations on GPU

In breve GPU moderne hanno equivalenti prestazioni INT e FP per i dati a 32 bit. Quindi le tue operazioni logiche funzioneranno alla stessa velocità.

Da un punto di vista della programmazione si perderanno le prestazioni se si hanno a che fare con i dati interi SCALAR. Le GPU amano lavorare con le operazioni PARALLEL e PACKED.

for(int i=0; i<LEN_VEC4; i++) 
    VEC4[i] = VEC4[i] * VEC4[i]; // (x,y,z,w) * (x,y,z,w) 

Se stai facendo qualcosa di simile ...

for(int i=0; i<LEN_VEC4; i++) 
    VEC4[i].w = (VEC4[i].x & 0xF0F0F0F0) | (VEC4[i].z^0x0F0F0F0F)^VEC4[i].w; 

... fare molte operazioni differenti su elementi dello stesso vettore si incorrere in problemi di prestazioni.

+0

Grazie per la risposta. In combinazione con post collegato è sufficiente, ma ho ancora una domanda. Come scritto, le prestazioni INT e FP dovrebbero essere le stesse. Ma non c'è nulla come operazioni bit a bit per FP (o almeno sarebbe strano farlo). Quindi cosa stanno dicendo di essere uguali .. aggiungendo e così via? E se questo è il caso, sono le operazioni bit a bit (ad esempio lo spostamento) più veloce di operazioni matematiche (aggiunta ..) per i tipi di dati INT, o anche la perfomance è uguale. – Raven

+0

Se "X bit shift left by 1" è più veloce di "x + x" è piuttosto dipendente dall'architettura. Mi auguro che si verifichi qualche ottimizzazione quando lo shadar è compilato (a meno che non lo si scriva nell'assemblaggio della GPU). "X divide per 2" è di origine più lenta di "X bit shift right 1" solo perché c'è più logica nella divisione che nel bit shift. –

+3

"Alle GPU piace lavorare con operazioni PARALLEL e PACKED." Le GPU più recenti di NVidia e AMD sono architetture scalari. Quindi, le prestazioni per operazioni puramente scalari sono in effetti superiori a quelle per le operazioni vettoriali. – datenwolf

Problemi correlati