2016-11-22 2 views
0

J'essaie de faire une multiplication matricielle entre une matrice 3x3 et une matrice 360x360. La plus petite matrice (3x3) va être manipulée avec le premier bloc (3x3) de la grande matrice et ainsi de suite. Par conséquent, je veux avoir ma matrice plus petite et la faire glisser sur ma plus grande matrice.cuda: multiplication de matrices en utilisant des matrices partagées et globales

Est-il possible de stocker ma matrice plus petite dans la mémoire partagée et ma plus grande matrice est divisée en 3x3 en global?

Je ne trouve pas un moyen de copier la plus petite matrice à partager directement à partir de l'hôte. Veuillez me corriger si ma visualisation de cuda est fausse.

Merci.

+2

Vous ne pouvez pas copier dans la mémoire partagée de l'hôte. Ce n'est pas supporté. – talonmies

Répondre

1

Il n'est pas possible de remplir la mémoire partagée de l'hôte. Cependant, la meilleure façon de gérer les constantes pour tous les threads, tels que la matrice 3x3 de votre exemple, est de les mettre en mémoire permanente (dont la taille est de 64 ko). Il existe deux façons d'utiliser la mémoire constante:

  • La méthode la plus simple consiste à utiliser les arguments du noyau. Définir un struct contenant vos arguments du noyau, y compris la matrice 3x3, et le transmettre à votre noyau
  • Utilisation de qualification de type __constant__ et utiliser cudaMemcpyToSymbol pour le remplir de l'hôte:

    //In global scope 
    __constant__ float mat_gpu[3][3]; 
    //In the function that you use to populate the data 
    cudaMemcpyToSymbol(mat_gpu, mat_cpu, 9 * sizeof(float)); 
    //In your kernel you just use the mat_gpu variable 
    
+0

Merci beaucoup votre réponse génial. Pouvez-vous donner un exemple pour l'utilisation de ce qualificatif __constant__ et cudaMemcpyToSymbol. Ce serait d'une grande aide. Merci d'avance. –

+1

J'ai ajouté l'exemple d'utilisation de cudaMemcpyToSymbol, espérons que cela aide! – ptrendx