9
votes

Multiplication matricielle à l'aide de Cuda

Je suis frappé avec la multiplication de matrice sur Cuda. La matrice de produit résultante est toujours nulle. J'ai lu des tests d'échantillons tels que multiplication matricielle dans Cuda pour résoudre mon problème, mais tout en vain .

En dehors du résultat erratique de 0, la taille maximale de "largeur" ​​(code ci-dessous) n'est même pas 512. Je n'ai pas pu déboguer là où le problème réside. Peut-être que nous pouvons en discuter sur Stackoverflow.

Je référente "Programmation massivement des processeurs parallèles" xxx


4 commentaires

Pour obtenir le formatage du code approprié, vous devez indenter tout code avec 4 espaces. Vous pouvez le faire facilement en soulignant votre code et en appuyant sur Ctrl + k .


Merci jeff! Allait juste faire ça


Si vous n'avez pas besoin de coller à votre propre code, le Guide de programmation CUDA C possède une merveilleuse implémentation matricielle-mul pouvant gérer des matrices avec d'autres dimensions que les pouvoirs de deux et optimisés à l'aide de la mémoire partagée. Je le recommande vivement pour une utilisation réelle mondiale et d'apprentissage.


@Dave gouttes d'eau fait un puissant océan. Pour atteindre un niveau, vous devez suivre étape par étape. par exemple. Si j'utilise directement le code donné à l'annexe A, je ne pourrai jamais savoir ce que les __syncThreads () - ne pas envisager la syntaxe amicale ;-)


3 Réponses :


0
votes

Dans votre fonction matrixmulkernel Votre boucle est comme xxx

au lieu de largeur , vous devez utiliser largeur * largeur comme tableau est de taille largeur * largeur .


1 commentaires

L'ensemble du point d'utilisation du parallélisme Cuda est d'éliminer le surcharge de calcul. Dans ce cas, chaque thread est responsable de seulement 1 résultat de la matrice de produit. Un résultat (élément) de la matrice de produit peut être trouvé à l'aide d'itérations "largeur". Donc, la largeur * La largeur ne va en aucun cas fonctionner.



4
votes

Vous alliez bien jusqu'à ce point:

$ ./test.exe
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000
125.000000


1 commentaires

En effet! Bien que je l'ai compris sans lire votre réponse et que je vais juste le poster.



1
votes

J'ai compris ce qui n'allait pas. Analysez-le:

point 1: la quête de supprimer la "valeur zéro" toujours monotonique

Comme indiqué, vous devez remplacer printf ("% d \ n", p [i]); comme printf ("% f \ n", p [i]);

Point 2: Pourquoi le programme échoue avec une valeur de largeur 512?

En réalité, cela échouera pour même une petite valeur telle que 23. Pourquoi? Parce que 23 * 23 est> 512 (le nombre maximum de threads qu'un GPU peut avoir par bloc à partir d'aujourd'hui!)


0 commentaires