2014-05-06 26 views
11

Sto utilizzando CUDA 6.0 e l'implementazione OpenCL fornita in bundle con l'SDK CUDA. Ho due kernel identici per ogni piattaforma (differiscono per le parole chiave specifiche della piattaforma). Loro leggono e scrivono solo la memoria globale, ogni posizione diversa del thread. La configurazione di avvio per CUDA è 200 blocks of 250 threads (1D), che corrisponde direttamente alla configurazione per OpenCL - 50,000 global work size and 250 local work size.Confronto prestazioni CUDA vs OpenCL

Il codice OpenCL è più veloce. È possibile o sto sbagliando? La mia comprensione è che l'implementazione OpenCL di NVIDIA è basata su quella per CUDA. Ottengo prestazioni migliori del 15% con OpenCL.

Sarebbe bello se si potesse suggerire perché potrei vedere questo e forse alcune differenze tra CUDA e OpenCL come implementato da NVIDIA?

+0

I risultati non sono coerenti tra problemi e casi. Ma il tuo potrebbe avere ragione. OpenCL funziona in modo asincrono per impostazione predefinita, quindi, se si utilizza CUDA così com'è (non-asincrono), probabilmente darà prestazioni leggermente più lente di OpenCL. – DarkZeros

+0

Ho già sentito che l'implementazione di OCL di NVIDIA è basata su CUDA. Tuttavia, ogni volta che ho cercato di trovare alcune fonti, non ho mai trovato alcuna prova di ciò. Ho concluso che si tratta di un errore basato sul fatto che CUDA viene erroneamente utilizzato come nome della lingua mentre in realtà è una "piattaforma di calcolo parallelo e un modello di programmazione" (Compute Unified Device Architecture) come da Wikipedia. Quindi quando vedi una diapositiva di NVIDIA che mostra che sotto OCL c'è una piccola chiamata CUDA è la GPU che è un chip CUDA. Potresti postare la tua fonte se ne hai? Mi piacerebbe sapere per certo. – CaptainObvious

+1

OpenCL e CUDA sono completamente diversi. Entrambi usano lo stesso HW alla fine. Ma proprio come OpenGL e DirectX, uno non è sotto l'altro o viceversa. I punti principali per affermare che le librerie sono diverse, i compilatori sono diversi e anche il modello di esecuzione è diverso. Alcune parti potrebbero essere comuni, ma la maggioranza no. – DarkZeros

risposta

13

I kernel in esecuzione su una GPU moderna non sono quasi mai legati all'elaborazione e sono quasi sempre limitati dalla larghezza di banda della memoria. (Poiché ci sono così tanti core di elaborazione in esecuzione rispetto al percorso disponibile in memoria.)

Ciò significa che le prestazioni di un determinato kernel di solito dipendono in gran parte dai modelli di accesso alla memoria esibiti dall'algoritmo specificato.

In pratica ciò rende molto difficile prevedere (o persino capire) quali prestazioni aspettarsi in anticipo.

Le differenze osservate sono probabilmente dovute a sottili differenze nei modelli di accesso alla memoria tra i due kernel derivanti da diverse ottimizzazioni effettuate dalla toolchain OpenCL vs CUDA.

Per informazioni su come ottimizzare i kernel GPU, è utile conoscere i dettagli dell'hardware di memorizzazione nella cache disponibile e il modo migliore per utilizzarlo. (ad esempio, facendo uso strategico di cache di memoria "locali" e andando sempre direttamente alla memoria "globale" in OpenCL.)