2012-02-09 19 views
11

Considera un semplice esempio: aggiunta vettoriale.Dispositivo OpenCL CPU vs dispositivo GPU

Se creo un programma per CL_DEVICE_TYPE_GPU e creo lo stesso programma per CL_DEVICE_TYPE_CPU, qual è la differenza tra di essi (eccetto che "programma CPU" è in esecuzione su CPU e "programma GPU" è in esecuzione su GPU)?

Grazie per il vostro aiuto.

risposta

35

Ci sono alcune differenze tra i tipi di dispositivo. La semplice risposta alla tua domanda vettoriale è: usa una gpu per vettori di grandi dimensioni e cpu per carichi di lavoro più piccoli.

1) Copia di memoria. Le GPU si basano sui dati su cui si sta lavorando per essere passati in essi, e i risultati vengono successivamente riletti all'host. Questo viene fatto su PCI-e, che produce circa 5 GB/s per la versione 2.0/2.1. Le CPU possono utilizzare i buffer "in place" - in DDR3 - utilizzando uno dei flag CL_MEM_ALLOC_HOST_PTR o CL_MEM_USE_HOST_PTR. Vedi qui: clCreateBuffer. Questo è uno dei grandi colli di bottiglia per molti kernel.

2) Velocità di clock. cpus ha attualmente un grosso vantaggio rispetto a gpus nella velocità di clock. 2 GHz per la maggior parte dei cpus, contro 1 GHz per la maggior parte dei gpus in questi giorni. Questo è un fattore che aiuta davvero la CPU a "vincere" su una GPU per piccoli carichi di lavoro.

3) "thread" contemporanei. Gpus di fascia alta di solito hanno più unità di calcolo rispetto alle loro controparti della CPU. Ad esempio, il 6970 gpu (Cayman) ha 24 unità di calcolo opencl, ognuna di queste è divisa in 16 unità SIMD. La maggior parte delle cpu desktop principali ha 8 core e la cpus del server attualmente si ferma a 16 core. (CPU core 1: 1 per calcolare il conteggio delle unità) Un'unità di calcolo in opencl è una parte del dispositivo che può eseguire un lavoro diverso dal resto del dispositivo.

4) Tipi di filettatura. gpus ha un'architettura SIMD, con molte istruzioni grafiche. cpus ha una vasta area dedicata alla previsione dei rami e ai calcoli generali. Una CPU può avere un'unità SIMD e/o un'unità in virgola mobile in ogni core, ma il chip Cayman che ho menzionato sopra ha 1536 unità con il set di istruzioni gpu disponibile per ognuna. AMD li chiama processori stream e ci sono 4 in ciascuna delle unità SIMD sopra menzionate (24x16x4 = 1536). Nessuna CPU disporrà di così tante unità sin (x) o dot-product a meno che il produttore non voglia ritagliare un po 'di memoria cache o hardware di previsione delle filiali. Il layout SIMD del gpus è probabilmente il più grande "successo" per le situazioni di aggiunta di vettori di grandi dimensioni. Che anche altre funzioni specializzate sono un grande vantaggio.

5) Larghezza di banda della memoria. cpus con DDR3: ~ 17 GB/s. Gpus di fascia alta> 100 GB/s, le velocità di oltre 200 GB/s si stanno diffondendo di recente. Se il tuo algoritmo non è limitato PCI-e (vedi # 1), la gpu supererà la CPU in accesso alla memoria grezza. Le unità di pianificazione in una GPU possono nascondere ulteriormente la latenza della memoria eseguendo solo attività che non sono in attesa di accesso alla memoria. AMD chiama questo un fronte d'onda, Nvidia lo chiama un teletrasporto. cpus ha un sistema di caching grande e complicato per aiutare a nascondere i tempi di accesso alla memoria nel caso in cui il programma riutilizzi i dati. Per il tuo problema di aggiunta del vettore, è probabile che il bus PCI-e ne limiterà di più poiché i vettori sono generalmente utilizzati solo una o due volte ciascuno.

6) Efficienza energetica. Una gpu (usata correttamente) di solito è più efficiente dal punto di vista elettrico di una CPU. Poiché la cpus è predominante nella velocità di clock, uno dei pochi modi per ridurre veramente il consumo energetico è il down-clock del chip. Questo ovviamente porta a tempi di elaborazione più lunghi. Molti dei migliori sistemi della lista dei 500 verdi sono stati accelerati in modo significativo. vedi qui: green500.org

Problemi correlati