Come allocare e trasferire (verso e da host) array 2D nella memoria del dispositivo in Cuda?Assegnare array 2D alla memoria del dispositivo in CUDA
risposta
Ho trovato una soluzione a questo problema. Non ho dovuto appiattire l'array.
La funzione incorporata cudaMallocPitch()
ha svolto il lavoro. E potrei trasferire l'array al e dal dispositivo usando la funzione cudaMemcpy2D()
.
Ad esempio
cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);
Questo crea una matrice 2D di dimensioni a * b con il passo come passato come parametro.
Il codice seguente crea un array 2D e loop sugli elementi. Compila facilmente, puoi usarlo.
#include<stdio.h>
#include<cuda.h>
#define height 50
#define width 50
// Device code
__global__ void kernel(float* devPtr, int pitch)
{
for (int r = 0; r < height; ++r) {
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
float element = row[c];
}
}
}
//Host Code
int main()
{
float* devPtr;
size_t pitch;
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height);
kernel<<<100, 512>>>(devPtr, pitch);
return 0;
}
Appiattirlo: renderlo unidimensionale. Guarda come funziona here
Il tuo codice dispositivo potrebbe essere più veloce. Prova a utilizzare di più i thread.
__global__ void kernel(float* devPtr, int pitch)
{
int r = threadIdx.x;
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
float element = row[c];
}
}
Quindi si calcola l'allocazione di blocchi e fili appropriata in modo che ogni thread abbia a che fare con un singolo elemento.
Il codice inviato da Gitmo è un campione inutile dei documenti. Sì, la tua versione è più veloce, ma come lo fai in parallelo per righe e colonne? A rigor di termini si potrebbe avere un casino tra le mani perché non si controlla se 'r' è inferiore al numero effettivo di righe – pelesl
è possibile assegnare una nuova riga per l'array in seguito? – scatman