2010-11-13 2 views
0

J'ai transmis un tableau 2D d'une classe C++ à une fonction CUDA; Cependant, une fois dans la fonction CUDA, les données de la matrice ont disparu. Je suis toujours dans l'hôte, pas dans l'appareil, donc je ne comprends pas ce que j'ai fait de mal car cela devrait être très simple.matrice apparaissant vide lorsqu'elle est passée de cpp à CUDA

Voici le C++

int main() 
{ 
    const int row=8; 
    const int column=8; 
    int rnum; 
    srand(time(0)); 
    rnum = (rand() % 100) + 1; 

    float table[row][column]; 

    for(int r=0; r<row; r++){ 
     for(int c=0; c<column;c++){ 
    table[row][column] = (rand()%100) + 1.f; 
    cout << table[row][column] << " "; 
     } 
     cout << "\n"; 
    } 

    //CUDA 
    handleMatrix(&table[0][0], 8); 

}

Voici le code CUDA qui est tout simplement l'impression de la matrice.

void handleMatrix(float * A, int size) 
{ 

    printf("&A[0]=%i\n",&A); 
    printf("A[0] is %f \n",A[0]); 
    for(int j=0; j<size; j++){ 
     for(int k=0; k<size;k++){ 
     printf("%f ",A[j +size*k]); // << " "; 
     } 
     printf("\n"); 
    } 
} 

Dans le fichier C++ - l'impression de la matrice a des nombres réels, mais la fonction CUDA se contente d'afficher des 0 fois pour la matrice et l'adresse de A [0]. Je ne sais pas si cela signifie que je ne passe pas correctement la matrice entre les 2 ou s'il y a quelque chose que je devrais faire avec la matrice une fois que je l'aurai à la fonction CUDA.

+0

Retiré, il n'y a pas de CUDA ici (pour l'instant!). – Kos

+0

@Kos Je me demandais la même chose ... –

Répondre

1

Ha, besoin d'un moment pour le trouver. Vérifiez l'indexation dans votre code de randomisation de la matrice. :) Vous utilisez les mauvaises variables et n'initialisez jamais les valeurs flottantes.

+0

Votre si correct. – Winter

+0

table [r] [c] = (rand()% 100) + 1.f; – Winter

+0

Exemple où une meilleure dénomination des variables aide? r => currentRow et row => numRows pourrait avoir rendu cela plus évident. J'essaie toujours d'apprendre cette leçon moi-même parfois. :) –

0

float * A est un pointeur sur l'hôte et non sur l'espace du périphérique. Utilisez cuda malloc + memcpy. float * A ne pas passer le contenu, seule l'adresse.

+0

Il n'y a pas de CUDA ici jusqu'à présent, en fait :), tout le problème est dans le code hôte. Oubliez le CUDA et résolvez pour C. – Kos