La multiplication de matrice à l'aide de plusieurs threads?
Je suis censé multiplier de 2 matrices à l'aide de threads. Deux choses: je reçois 0 quand je lance le programme. Je reçois aussi des messages d'erreurs(pour chacun d'eux, il dit: "warning: passing argument 1 of 'printMatrix' from incompatible pointer type" sur les lignes en gras(où j'essaie d'imprimer la sortie). Également à noter, le premier bloc qui est en gras, je que c'était ma tentative de résoudre le problème. Je pense que je suis proche, mais je ne peut pas l'être. Quelqu'un peut-il aider? Merci 🙂
La sortie ressemble à ceci:
A=
1 4
2 5
3 6
B=
8 7 6
5 4 3
A*B=
0 0 0
0 0 0
0 0 0
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define K 2
#define N 3
struct v
{
int i; //row
int j; //column
};
int A[M][K] = {{1,4},{2,5},{3,6}};
int B[K][N] = {{8,7,6},{5,4,3}};
int C[M][N];
void *workerThread(void *data)
{
int i=((struct v*)data)->i;
int j=((struct v*)data)->j;
int accumulator = 0;
/*this is where you should calculate the assigned Cell. You will need to use the row(i) of
A and column[j] of B. Accumulate the result in accumulator */
**int k;
for(k=0; k<k; k++)
{
accumulator = A[i][k]*B[k][j];
}
C[i][j]=accumulator;
pthread_exit(NULL);**
}
void printMatrix(int *matrixIn, int rows, int columns)
{
int *matrix = matrixIn;
int i,j;
for (i=0;i<rows;i++)
{
}
int main (int argc, char *argv[])
{
pthread_t threads[M*N];
int i,j;
int counter = 0;
int numThreadsCreated = 0;
/*the following 5 lines demonstrates how to create 1 thread to calculate C[0][0], you
will need to create a loop for all of C's cells*/
struct v *data = (struct v *)malloc(sizeof(struct v));
data->i = 0; //assign the row of C for thread to calculate
data->j = 0; //assign the column of C for thread to calculate
pthread_create(&threads[0], NULL, workerThread, data);
numThreadsCreated++;
/*wait for all the threads to finish before printing out the matrices*/
for(j=0; j < numThreadsCreated; j++)
{
pthread_join( threads[j], NULL);
}
printf("A=\n");
**printMatrix(A,3,2);**
printf("B=\n");
**printMatrix(B,2,3);**
printf("A*B=\n");
**printMatrix(C,M,N);**
pthread_exit(NULL);
}
Cette ligne est erronée,--->
Comment alors? C'était la ligne j'ai été recommandé par quelqu'un d'autre. @shekharsuman
Vérifier ma réponse pour plus de précisions et d'essayer la même chose et puis d'autres commentaires au sujet de votre problème!!!!!!
À moins que votre M et N sont énormes, cela ne va pas être beaucoup d'un rendement gagner. Vous devriez la recherche pour "parallèle de multiplication de matrice" pour voir les différentes approches alternatives au problème lorsque vous traitez avec des matrices de grande taille.
for(k=0; k<k; k++)
!Comment alors? C'était la ligne j'ai été recommandé par quelqu'un d'autre. @shekharsuman
Vérifier ma réponse pour plus de précisions et d'essayer la même chose et puis d'autres commentaires au sujet de votre problème!!!!!!
À moins que votre M et N sont énormes, cela ne va pas être beaucoup d'un rendement gagner. Vous devriez la recherche pour "parallèle de multiplication de matrice" pour voir les différentes approches alternatives au problème lorsque vous traitez avec des matrices de grande taille.
OriginalL'auteur Jay | 2014-10-21
Vous devez vous connecter pour publier un commentaire.
Votre programme semble avoir mis en œuvre un mauvais codage de l'algorithme de multiplication de matrice.
Le morceau de code suivant semble absurde :-
Vous devez mettre en place quelque chose comme :-
Vous avez besoin d'utiliser le capital OU de bloquer l'alphabet
K
au lieu de bas-de-cassek
!!! Vous avez#define K=3
. Comment peut-il donner d'erreur? Veuillez vérifier votre cas!Les messages d'erreur se référer à cette ligne: for (int quelque chose = 0; quelque chose<k; quelque chose++)
Eh bien, c'est encore de me donner les mêmes 3 messages d'erreur à l'impression de ces matrices, et aussi un autre message d'erreur de la dernière ligne(fin de support) qui dit: erreur: taux de déclaration ou de déclaration à la fin de l'entrée
Il a travaillé! ... Je pense, il me donne toujours ce message d'erreur, mais il a multiplié.
OriginalL'auteur Am_I_Helpful
FWIW... pour une petite matrice le coût de la création de threads et qu'est-ce-pas est susceptible de dire tout cela est une perte de temps... et pour une matrice de grande taille vous semblent commencer M*N threads !!
Puisque l'on peut supposer que cela est liée au calcul, il n'y a pas beaucoup de point de départ à plus de threads qu'il y a de Processeurs à utiliser. Ensuite, chaque thread doit choisir le prochain élément de résultat de calculer, et de s'arrêter quand le résultat est plein. Une façon de le faire serait de passer d'un "contrôle" de la structure à tous les pthreads, le long des lignes de:
et puis pthread avec fonction de boucle:
Atomique chercher et ajouter 1 de
q
serait faire le travail aussi bien. (NB: suppose que N*M + thread-count <= INT_MAX !)Vous pouvez, bien sûr, de diviser la
N * M
résultats de manière statique à travers le nombre de pthreads de commencer, donc passer chacun un différent initialeq
et le nombre d'éléments de résultat dont il est responsable (se souvenir pour le reste de la division deN * M
par le nombre de pthreads !). Cela évite tous besoin pour les pthreads d'interagir -- donc pas de mutex et pas de atomics nécessaire.OriginalL'auteur
OriginalL'auteur Sandeep Kumar