La matrice se Multiplier avec les Threads (chaque fil unique multiplier)

Je suis à la recherche de faire une matrice de multiplier à l'aide de threads où chaque fil unique de multiplication et puis le thread principal va ajouter tous les résultats et de les placer à l'endroit approprié dans le final de la matrice (après les autres threads ont quitté).

La façon dont je suis en train de faire est de créer une ligne unique tableau qui contient les résultats de chaque thread. Puis j'irais dans le tableau et ajouter + placer les résultats dans le final de la matrice.

Ex: Si vous avez les matrices:

Un = [{1,4}, {2,5}, {3,6}]
B = [{8,7,6}, {5,4,3}]

Ensuite, je veux un tableau de portefeuille [8, 20, 7, 16, 6, 12, 16 etc]
Je serais alors en boucle dans le tableau en ajoutant toutes les 2 numéros et de les placer dans mon tableau final.

C'est une tache HW donc je ne suis pas à la recherche pour le code exact, mais un peu de logique sur la façon de stocker les résultats dans le tableau correctement. Je suis aux prises avec la façon de garder trace de l'endroit où je suis dans chaque matrice, de sorte que je ne manquez pas les chiffres.

Grâce.

EDIT2: j'ai Oublié de mentionner qu'il doit y avoir un seul thread pour chaque multiplication à faire. Sens pour l'exemple ci-dessus, il y aura 18 fils de chaque fait son propre calcul.

EDIT: je suis actuellement en utilisant ce code comme une base pour travailler.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define M 3
#define K 2
#define N 3
#define NUM_THREADS 10
int A [M][K] = { {1,4}, {2,5}, {3,6} };
int B [K][N] = { {8,7,6}, {5,4,3} };
int C [M][N];
struct v {
int i; /* row */
int j; /* column */
};
void *runner(void *param); /* the thread */
int main(int argc, char *argv[]) {
int i,j, count = 0;
for(i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
//Assign a row and column for each thread
struct v *data = (struct v *) malloc(sizeof(struct v));
data->i = i;
data->j = j;
/* Now create the thread passing it data as a parameter */
pthread_t tid;       //Thread ID
pthread_attr_t attr; //Set of thread attributes
//Get the default attributes
pthread_attr_init(&attr);
//Create the thread
pthread_create(&tid,&attr,runner,data);
//Make sure the parent waits for all thread to complete
pthread_join(tid, NULL);
count++;
}
}
//Print out the resulting matrix
for(i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
printf("%d ", C[i][j]);
}
printf("\n");
}
}
//The thread will begin control in this function
void *runner(void *param) {
struct v *data = param; //the structure that holds our data
int n, sum = 0; //the counter and sum
//Row multiplied by column
for(n = 0; n< K; n++){
sum += A[data->i][n] * B[n][data->j];
}
//assign the sum to its coordinate
C[data->i][data->j] = sum;
//Exit the thread
pthread_exit(0);
}

Source: http://macboypro.wordpress.com/2009/05/20/matrix-multiplication-in-c-using-pthreads-on-linux/

Cela a été fait à peu près une centaine de milliers de fois avant. vous allez être bien de plus par la détermination de la CPU core-comte C sur la machine, déterminer le nombre de lignes x vecteur Colonne de multiplications sont nécessaires, en divisant ce dernier par l'ancien (à peu près) et l'envoi que pour C threads pour traiter indépendamment l'un de l'autre. Tout modulo (en sus des vecteurs jusqu'à C-1 ) sont envoyés en supplément, se multiplie à la première série de threads. Vous aurez du mal à obtenir un plus efficace et simple de l'algorithme, en particulier compte tenu absolument aucun verrouillage n'est nécessaire que ce soit.
Désolé, je n'étais pas clair. En fonction de l'affectation, il doit y avoir 1 fil de chaque multiplication qui doit être fait. Sens, pour l'exemple des matrices que j'ai donné, il y aura 18 threads fait 18 multiplications. Il n'est pas destiné à être efficace. C'est juste un HW exercice.
Ouais, je suppose que ça doit être juste un exercice. Le concept se dégrade assez rapidement lorsque vous prenez quelque chose comme A[500][800] x B[800][1000]. Plus il vieillit, plus le temps vous serez en mesure de dépenser de départ de rejoindre les threads quand vous pourriez être barattage de multiplications. Ah bien. Bonne chance!
Si les matrices sont assez grands, vous pouvez également enquêter sur la algorithme de Strassen pour la multiplication matricielle - et le crédit supplémentaire?

OriginalL'auteur Kinru | 2013-03-16