2009-06-26 6 views

risposta

16

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; 
} 
+0

è possibile assegnare una nuova riga per l'array in seguito? – scatman

3

Appiattirlo: renderlo unidimensionale. Guarda come funziona here

2

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.

+0

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