2009-06-26 11 views

Répondre

16

J'ai trouvé une solution à ce problème. Je n'ai pas eu à aplatir le tableau.

La fonction cudaMallocPitch() intégrée a fait le travail. Et je pourrais transférer le tableau vers et depuis l'appareil en utilisant la fonction cudaMemcpy2D().

Par exemple

cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b); 

Cela crée un tableau 2D de taille a * b avec le pas comme passé en tant que paramètre.

Le code suivant crée un tableau 2D et boucle sur les éléments. Il compile facilement, vous pouvez l'utiliser.

#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

est-il possible d'allouer une nouvelle ligne pour le tableau plus tard? – scatman

3

Aplatissez-le: rendez-le unidimensionnel. Voir comment c'est fait here

2

Votre code de produit pourrait être plus rapide. Essayez d'utiliser les discussions plus. Ensuite, vous calculez l'allocation de blocs et de threads appropriée afin que chaque thread traite un seul élément.

+0

Le code Gitmo posté est un exemple inutile des docs. Oui, votre version est plus rapide, mais comment faites-vous cela en parallèle pour les lignes et les colonnes? Strictement parlant, vous pourriez avoir un bordel entre vos mains parce que vous ne vérifiez pas si 'r' est inférieur au nombre réel de lignes – pelesl