2012-01-14 11 views
7

Ogni dispositivo GPU (AMD, NVidea o qualsiasi altro) è suddiviso in più unità di elaborazione (MultiProcessors), ognuna delle quali ha un numero fisso di core (VertexShaders/StreamProcessors). Quindi, uno ha processori simultanei da computare con (Compute Units) x (VertexShaders/compute unit), ma c'è solo una piccola quantità fissa di memoria __local (di solito 16KB o 32KB) disponibile per MultiProcessor. Quindi, il numero esatto di questi multiprocessore conta.Dimensioni della memoria locale OpenCL e numero di unità di calcolo

Ora le mie domande:

  • (a) Come posso sapere il numero di multiprocessori su un dispositivo? È lo stesso di CL_DEVICE_MAX_COMPUTE_UNITS? Posso dedurlo dai fogli delle specifiche come http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units?
  • (b) Come posso sapere quanto è disponibile la memoria __local per MP su una GPU prima dell'acquisto? Naturalmente posso richiedere CL_DEVICE_LOCAL_MEM_SIZE su un computer che lo esegue, ma non vedo come posso dedurlo anche da un singolo foglio di specifiche dettagliate come http://www.amd.com/us/products/desktop/graphics/7000/7970/Pages/radeon-7970.aspx#3?
  • (c) Qual è la scheda con il più grande CL_DEVICE_LOCAL_MEM_SIZE? Il prezzo non ha molta importanza, ma 64KB (o più grande) darebbe un chiaro vantaggio per l'applicazione che sto scrivendo, dal momento che il mio algoritmo è completamente parallelizzabile, ma anche ad alta intensità di memoria con pattern di accesso casuale all'interno di ogni MP (iterando oltre i bordi di grafici).
+0

Provare a eseguire la query del dispositivo negli esempi forniti da AMD/NVIDIA nell'SDK. Se vuoi conoscere le query sul dispositivo di un dispositivo specifico, ci sono molti che lo hanno messo online. – nouveau

risposta

7
  1. CL_DEVICE_MAX_COMPUTE_UNITS dovrebbe dare il numero di ComputeUnits, altrimenti si può sguardo da manuali appropriati (il AMD opencl programming guide e la Nvidia OpenCL programming guide)
  2. La guida collegato per AMD contiene informazioni sul availible memoria locale per unità di elaborazione (generalmente 32kB/CU). Per NVIDIA una rapida ricerca su google ha rivelato this document, che fornisce la dimensione della memoria locale come 16kB/CU per le GPU basate su G80 e G200. Per le carte basate sui fermi (GF100) sono disponibili 64kB di memoria onchip, che possono essere configurati come 48kB di memoria locale e 16kB di cache L1 o 16kB di memoria locale e 48kB di cache L1. Inoltre le carte fermi hanno una cache L2 fino a 768kB (768kB per GF100 e GF110, 512kB per GF104 e GF114 e 384kB per GF106 e GF116, nessuna per GF108 e GF118 secondo wikipedia).
  3. Dalle informazioni precedenti sembrerebbe che le attuali schede nvidia abbiano la memoria più locale per unità di calcolo. Inoltre è l'unico con una cache L2 generale dalla mia comprensione.

per il vostro uso di memoria locale tuttavia si dovrebbe ricordare che la memoria locale viene allocata per ogni gruppo di lavoro (e accessibile solo per un gruppo di lavoro), mentre un'unità Compute in genere può sostenere più di un gruppo di lavoro. Quindi se il tuo algoritmo ha assegnato l'intera memoria locale a un gruppo di lavoro che non sarai in grado di utilizzare, raggiungi la massima quantità di parallelismo. Si noti inoltre che dal momento che la memoria locale è inclinata, l'accesso casuale porterà a molti conflitti bancari e serializzazioni di warp. Quindi il tuo algoritmo potrebbe non essere abbastanza simile a quello che pensi (o forse lo farà, solo menzionando la possibilità).

Con una scheda basata su Fermi, la soluzione migliore potrebbe essere quella di contare sulla cache anziché sulla memoria locale esplicita, se tutti i gruppi di lavoro operano sugli stessi dati (non so come cambiare la configurazione della memoria locale/L1).

+0

Questo è un punto molto interessante in cui ci si innalza, il mio algoritmo consuma effettivamente tutta la memoria locale per unità di calcolo.Quanti gruppi di lavoro dovrebbero essere in esecuzione sulla stessa unità di elaborazione per farla girare a (quasi) a piena velocità? – user1111929

+0

Inoltre, quella cache L2 sembra interessante, ma non capisco. I dispositivi moderni hanno come unità di calcolo 32, e Fermi fornisce una cache L2 da 768KB, che è solo 24KB per unità di calcolo (rispetto a 64KB L1)? Cioè c'è meno L2 di L1 cache ??? O sto fraintendendo il punto di questa cache? – user1111929

+0

Addendum al mio primo commento sopra: ogni gruppo di lavoro consisterà di poche centinaia di oggetti di lavoro. – user1111929

Problemi correlati