2010-03-14 14 views
8

Sto appena iniziando ad imparare OpenCL. Sto cercando di capire quali sono le prestazioni che si aspettano quando si spostano funzioni/algoritmi nella GPU.Qual è la funzione più banale che sarebbe utile per essere calcolata su una GPU?

Il kernel più elementare proposta nella maggior tutorial è un kernel che prende due array di numeri e somma il valore degli indici corrispondenti e li aggiunge un terzo array, in questo modo:

__kernel void 
add(__global float *a, 
    __global float *b, 
    __global float *answer) 
{ 
    int gid = get_global_id(0); 
    answer[gid] = a[gid] + b[gid]; 
} 

__kernel void 
sub(__global float* n, 
    __global float* answer) 
{ 
    int gid = get_global_id(0); 
    answer[gid] = n[gid] - 2; 
} 

__kernel void 
ranksort(__global const float *a, 
     __global float *answer) 
{ 
    int gid = get_global_id(0); 
    int gSize = get_global_size(0); 
    int x = 0; 
    for(int i = 0; i < gSize; i++){ 
    if(a[gid] > a[i]) x++; 
    } 
    answer[x] = a[gid]; 
} 

sto supponendo che non si può mai giustificare il calcolo di questo sulla GPU, il trasferimento di memoria potrebbe far pesare il tempo necessario a calcolare questo sulla CPU in base alle grandezze (potrei sbagliarmi su questo, quindi questa domanda).

Quello che mi chiedo è quale sarebbe l'esempio più banale in cui ci si aspetterebbe una significativa accelerazione quando si utilizza un kernel OpenCL invece della CPU?

risposta

6

se si dispone di un set sufficientemente grande di matrici che si desidera eseguire operazioni di algebra lineare o che si esegue essenzialmente la stessa operazione su ciascun elemento, considererei un esempio banale. moltiplicazione di matrice, aggiunta, fft, convoluzione, ecc. vedrai un po 'di accelerazione senza fare molto lavoro. ora, se vuoi vedere gli accelerazioni 100x, devi approfondire la gestione della memoria e sapere bene cosa succede dietro le quinte.

per iniziare, vorrei raccomandare di iniziare con pycuda dato che è abbastanza semplice iniziare poiché fornisce un livello molto alto di astrazione e ti permetterà di saltare molto velocemente. consulta questo corso sul calcolo parallelo usando cuda dall'università dell'illinois http://courses.ece.illinois.edu/ece498/al/ quando sei pronto per immergerti ulteriormente.

+0

Il collegamento è interrotto. – user

3

dipende dalla definizione di banale. a mio parere sarebbe un prodotto matrice matrix, dal momento che ha un rapporto di memoria pari a O(3)/O(2). Gli algoritmi che mostrano rapporti simili possono trarre vantaggio dall'essere in competizione su GPU.

+0

moltiplicazione di matrici è lontano da una banale applicazione e non il miglior esempio di un applicazione che può beneficiare del calcolo della GPU. – Eric

0

Dopo la moltiplicazione della matrice, direi convoluzione immagine (come sfocatura, denoising ecc.). Check out AMD's tutorial.

2

Mentre il kernel è chiaramente molto banale può essere un esempio utile, è completamente legato alla memoria poiché per ogni elemento si hanno due letture e una sola scrittura, e solo una operazione aritmetica. Ci sono alcune istruzioni per calcolare l'indirizzo ecc., Ma tutto ciò non ha praticamente nulla in confronto al costo di accesso alla memoria.

Supponendo che i dati siano già sulla GPU, è possibile beneficiare della larghezza di banda molto elevata della GPU per la memoria anche per questo semplice kernel.

Naturalmente, le GPU fanno affidamento su una quantità sufficiente di thread per nascondere la latenza della memoria, pertanto le dimensioni del gruppo di lavoro locale devono essere piuttosto grandi (ad esempio 256 o 512) e le dimensioni del gruppo di lavoro globale devono essere molto grandi (ad es. migliaia) affinché questo sia efficace, ma questo è il punto!

0

Ciò che è "più banale" è una questione di opinione, ma direi che il calcolo di un'immagine del set Mandelbrot è un'applicazione piuttosto semplice che utilizza la GPU. Ogni punto è totalmente indipendente da ogni altro punto, quindi puoi iniziare una discussione per ogni punto e ottenere un'incredibile velocità. La formula stessa che viene iterata è una semplice funzione quadratica. L'ho usato come esempio in un tutorial che può essere trovato sul mio blog here, semplicemente calcolando i numeri senza nemmeno creare un'immagine per renderla ancora più semplice. Quasi ogni imbarazzante problema parallelo (vedi voce di Wikipedia) è un buon inizio.

1

So che la domanda è piuttosto vecchia ma ... ho trovato che i calcoli del set Mandelbrot sono ottimali per la GPU. Avete un vettore di input complesso (float2) e un output scalare (int) e avrete in media un centinaio di operazioni per vettore di input.

Potrebbe essere usato come un buon esempio di applicazione, in quanto ...

  • ha un set di dati di ingresso a 2 dimensioni (calcola un'immagine)
  • si può spiegare il motivo per cui fronti d'onda e 2 di elaborazione tridimensionale è utile in alcuni casi
  • dimostra tipi di dati vettoriali
  • produce un quadro, che è rapidamente verificabile da occhi umani (debugging)
  • può essere facilmente esteso da: mappatura dei colori (__const ant), elaborazione float4 invece di float2 (ottimizzazione), che produce vettori di uscita int4 (R, G, B, A) (ottimizzazione). Livelli di riduzione (RGBA) => (RGB)
  • conoscenza matematica necessario è accettabile (formula semplice)

saluti, Stefan

Problemi correlati