2013-02-27 3 views
1

J'ai lu quelques threads sur stackoverflow sur les tableaux 2D et cudaMallocPitch et j'ai essayé d'utiliser cudaMallocPitch avec la petite documentation que j'ai trouvée. Cependant, je suis maintenant confronté à un problème.Tableau 2D avec CUDA et cudaMallocPitch

je besoin de passer par un tableau et faire quelque chose de similaire:

for(int k=0; k<100; ++k){ 
    for(i=SID; i<SID+stride; ++i){ 
     while(-1 < j && Driver[k][j] != Road[i]){ 
      j = Pilot[j][k]; 

     } 
     ++j; 
    } 
    } 

Je me demandais donc, comment dois-je adapter ce code pour le faire fonctionner avec le terrain, parce que j'ai lu que je devais mettre à jour le pointeur au début de la ligne. Bien sûr, mon noyau reçoit ce qui suit:

__global__ void driving(char *Driver, size_t pitch_driver, 
         char *Road, int *Pilot, size_t pitch_pilot) 

Et je ne suis pas vraiment sûr de savoir comment faire les choses à travailler, je l'ai lu et d'essayer, mais il semble ne fonctionne pas à l'heure actuelle.

Merci.

Edit 1: Je lis ce fil en particulier: How to use 2D Arrays in CUDA? et suis tombé sur les lignes:

for (int row = 0; row < rowCount; row++) 
{ 
    // update the pointer to point to the beginning of the next row 
    float* rowData = (float*)(((char*)d_array) + (row * pitch)); 
    for (int column = 0; column < columnCount; column++) 
    { 
     rowData[column] = 123.0; // make every value in the array 123.0 
     destinationArray[(row*columnCount) + column] = rowData[column]; 
     } 
} 

qui est mise à jour le pointeur de la ligne suivante, I'am ne sais pas comment utiliser faire mes 2 boucles et tout en travaillant comme dans le code précédent. À l'heure actuelle, je ne peux accéder qu'à une dimension de ma matrice mais pas à l'autre.

il renvoie la valeur 2, mais lorsque j'essaie mes comparaisons multiples, il ne renvoie que 0, ou même comparer deux valeurs ne fonctionnent pas.

+2

Qu'est-ce qui ne fonctionne pas exactement? Quelle partie du processus ne comprenez-vous pas? – talonmies

+0

Cela ne fonctionne pas lorsque j'essaie de parcourir la matrice. Basé sur quelque chose de similaire à ce que j'ai édité. – Anoracx

+0

Je pense que vos questions se résument à ceci: de vrais tableaux 2D posent des problèmes en C, et encore plus de problèmes en CUDA. Au lieu de cela, 'cudaMallocPitch()' représente le tableau 2D en tant que tableau 1D auquel vous accédez simplement comme: 'array [row * pitch + column];'. C'est tout. Si vous avez vraiment besoin d'un pointeur au début d'une ligne, vous pouvez utiliser 'ptr = & array [row * pitch];' – Peter

Répondre

1

Dans le Manuel de référence CUDA, il dit:

5.8.2.17 cudaError_t cudaMallocPitch (devPtr vide, pas size_t, largeur size_t, hauteur size_t)

[...]

Étant donné la ligne et la colonne de un élément de tableau de type T, l'adresse est calculée comme suit:

T * pElement = (T *) ((char *) BaseAddress + Row * pitch) + Colonne;

Vous devez donc d'abord lancer votre pointeur sur char *, faire le calcul, puis le renvoyer à votre type.

Questions connexes