2013-01-22 16 views
8

Sono confuso circa la differenza tra l'uso previsto dei puntatori di dispositivo e le strutture cudaArray. Qualcuno potrebbe spiegare perché userei l'uno contro l'altro? Il mio problema di base è che dopo aver consultato la documentazione e aver letto il libro "CUDA di Example", non capisco l'intento dei progettisti dell'API.cudaArray vs. puntatore del dispositivo

Da quello che ho visto, sembra che cudaArray debba essere usato per trame e puntatori dovrebbero essere usati per accedere direttamente alla memoria. Sembra anche che le trame 3D possano essere create solo usando uno cudaArray. Tutte le trame dovrebbero essere allocate usando cudaArray? Numerosi esempi sembrano non farlo. Inoltre, perché esiste una funzione cudaMallocArray e cudaMallocArray3D, ma non equivalente per cudaMallocArray2D? Al contrario, c'è un cudaBindTexture e cudaBindTexture2D, ma non cudaBindTexture3D?

risposta

16

cudaArray è un blocco di memoria opaco ottimizzato per il collegamento alle trame. Le trame possono utilizzare la memoria memorizzata in un space filling curve, che consente una percentuale di percussione della cache di texture migliore a causa di una migliore localizzazione spaziale 2D. Copiando i dati su un cudaArray, verrà formattato su tale curva.

Pertanto, la memorizzazione dei dati in un cudaArray è una tecnica di ottimizzazione che può produrre tassi di hit della cache di texture migliori. Nelle prime architetture CUDA, anche il kernel cudaArray non è accessibile. Tuttavia, le architetture della capacità di calcolo> = 2.0 possono accedere all'array tramite superfici CUDA.

Determinare se è necessario utilizzare un cudaArray o un buffer regolare nella memoria globale si riduce all'utilizzo previsto e ai modelli di accesso per la memoria. Sarà specifico del progetto.

cudaMallocArray() assegna effettivamente un array 2D, quindi penso che il problema sia solo la denominazione incoerente. Forse sarebbe stato più logico chiamarlo cudaMallocArray2D().

Non ho usato trame 3D. Speriamo che qualcuno risponda e ci faccia sapere perché non è necessario per cudaBindTexture3D().

1

È possibile utilizzare cudaBindTextureToArray, funziona sia per 2D che per 3D.

Problemi correlati