2010-11-13 4 views
3

Hey Guys, Je suis un gars de Java sautant dans CUDA et la syntaxe me fait trébucher. J'essaie de créer une matrice dans le fichier .cpp puis de la passer au fichier .cu à traiter. Je vois des exemples où la fonction CUDA attend le tableau 2D à venir dans la recherche commepasser un tableau 2D à partir d'une classe C++ à une fonction CUDA

void handleMatrix(float* A){ 
    // do stuff 
} 

lorsque je crée la matrice que je suis habitué à le faire dans le code qui ressemble à ceci:

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 << "\n"; 
    } 

    handleMatrix(table); 
    return 0; 
} 

Lorsque Je compile le code que je reçois l'erreur ne peut pas convertir 'float () [8]' 'flotter *' pour argument '1' à 'handleMatrix void (float *)' *

y at-il un de différentes façons, je devrais être déclaré la matrice ou la créer?

Merci d'avance pour l'aide.

Répondre

1

Vous pouvez faire

handleMatrix(table[0]); 

ou, ce qui revient,

handleMatrix(&table[0][0]); 

C'est si 'handleMatrix' est le code hôte. Si c'est le code de l'appareil, vous ne pouvez pas allouer le tampon comme ça. Vous devrez assembler un tableau dans la mémoire locale, remplir les entrées, allouer un autre tableau dans la mémoire de l'appareil en utilisant cudaMalloc() ou cudaMallocPitch(), puis copier du local vers l'appareil en utilisant cudaMemcpy() ou cudaMemcpy2D().

0

Vous voulez un pointeur vers un tableau. La syntaxe pour déclarer un pointeur vers un tableau est

void handleMatrix(float (*A)[8][8]) { 
    // do stuff 
} 

qui est, quand vous déréférencer A, vous obtenez une référence à un 8 par 8 tableau de flotteurs.

Même pour les tableaux 1D, il existe une distinction entre le pointeur vers le tableau (float (*anArray)[100]) et le pointeur vers l'élément (float *anArray). C + + convertit le premier en transparent, ce qui signifie que pour les tableaux 1D (mais pas les tableaux de plus grande dimension), vous pouvez généralement ignorer la différence.

0

Dans votre exemple, table[0] est converti en pointeur valide float* en 64 nombres flottants consécutifs. Mais il semble hautement suspect que handleMatrix prenne un pointeur destiné à être un tableau et ne prenne aucune information sur les dimensions de ce tableau.

0

la fonction handleMatrix(), est-ce une fonction de vous ou fait partie d'une bibliothèque? Si c'est le cas, vous devrez peut-être créer le tableau 2-d sous la forme d'une rangée longue x col 1-d. Si le premier vous devez changer la fonction pour accepter un tableau de 2-d par exemple. handleMatrix (float ** m) et passe les dimensions de la matrice à la fonction;

De préférence, bien que vous deviez utiliser le vecteur <> lors de la programmation en C++, les dimensions sont connues par l'appelé.

par exemple.

#include <vector> 
    typedef std::vector<std::vector<float > > matrix; 

    void handleMatrix(matrix& m) {..} 
+0

Ceci est correct dans le code hôte seulement, cependant, un vecteur std :: ne peut pas être passé à un noyau CUDA. – Heatsink

Questions connexes