2012-12-29 1 views
6

In "CUDA C Programming Guide 5.0", p73 dice "Qualsiasi indirizzo di una variabile che risiede nella memoria globale o restituito da una delle routine di allocazione della memoria dal driver o dall'API di runtime è sempre allineato ad almeno 256 byte". Non conosco il significato esatto di questa frase. Qualcuno potrebbe mostrare un esempio per me? Grazie molto.allineamento cuda 256 byte seriamente?

Una domanda derivata: Quindi, che ne è l'assegnazione di un array unidimensionale di elementi di base (come int) o di quelli auto-definiti? L'indirizzo iniziale dell'array sarà multiplo di 256B, mentre l'indirizzo di ciascun elemento dell'array non è necessariamente un multiplo di 256B?

+2

L'indirizzo iniziale di qualsiasi cudaMalloc sarà multiplo di 256. 256 è due simboli in esadecimale, saranno zero in addrexx; in modo da poter ottenere l'indirizzo come 0x0456ad00 ma non 0x0456ad80. – osgx

risposta

8

I puntatori che sono assegnati utilizzando uno qualsiasi di funzioni di allocazione di memoria del dispositivo di CUDA runtime EG cudaMalloc o cudaMallocPitch sono garantiti per essere 256 byte allineati, cioè l'indirizzo è un multiplo di 256.

consideri il seguente esempio:

char *ptr1, *ptr2; 

int bytes = 1; 

cudaMalloc((void**)&ptr1,bytes); 
cudaMalloc((void**)&ptr2,bytes); 

Supponiamo l'indirizzo restituito in ptr1 è un multiplo di 256, l'indirizzo restituito in ptr2 sarà atleast (ptr1 + 256).

Questa è una restrizione imposta dal dispositivo su cui è allocata la memoria. Principalmente, i puntatori sono allineati a causa delle prestazioni. (Alcuni ragazzi di NVIDIA dovrebbero essere in grado di dire se c'è anche qualche altra ragione).

Importante:

allineamento puntatore non è sempre 256. Sul mio dispositivo (GTX460M), è 512. È possibile ottenere l'allineamento del puntatore del dispositivo tramite il campo cudaDeviceProp::textureAlignment.

L'allineamento dei puntatori è anche un requisito per legare il puntatore alle trame.

+2

Fornire il comodo collegamento di trame alla memoria allocata tramite cudaMalloc() senza la necessità di ricorrere alle correzioni di trama è un'altra ragione oltre alle prestazioni per l'allineamento puntatore fornito da cudaMalloc(). – njuffa

+0

Ho aggiunto una domanda derivativa. per favore aiutami a capirlo @ sgar91. – Rock

+0

Sei sicuro che qualsiasi risultato di 'cudaMalloc()' ha allineamento non inferiore a 'cudaDeviceProp :: textureAlignment'? – einpoklum