Matrix Multiplizieren mit Threads (jeder thread hat eine einzige multiplizieren)

Ich bin auf der Suche nach einer matrix multiplizieren, die Verwendung von threads, wo jeder thread ist eine einzelne Multiplikation und dann die Haupt-thread hinzufügen, bis alle Ergebnisse und legen Sie Sie in die entsprechende Stelle in der letzten matrix (nachdem die anderen threads beendet haben).

So, wie ich bin versucht zu tun ist erstellen Sie eine einzelne Zeile array, das hält die Ergebnisse in jedem thread. Dann würde ich gehen durch das array und fügen Sie + die Ergebnisse in die endgültige matrix.

Ex: Wenn Sie die Matrizen:

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

Dann möchte ich ein array holding [8, 20, 7, 16, 6, 12, 16 etc.]
Ich würde dann in einer Schleife durch das array zu addieren, jede 2-zahlen und legte Sie in meinem letzten array.

Dies ist ein HW-Zuordnung, so Suche ich nicht nach dem genauen code, aber eine gewisse Logik auf, wie Sie speichern Sie die Ergebnisse in das array richtig. Ich habe Mühe mit zu halten, wie Sie den überblick, wo ich bin in jeder matrix so, dass ich verpasse keine zahlen.

Dank.

EDIT2: Vergessen zu erwähnen, dass es einen einzigen thread für jede einzelne Multiplikation zu tun. Bedeutung für das Beispiel oben, es werden 18 Themen jeder macht seine eigene Kalkulation.

EDIT: ich bin derzeit mit diesem code als Basis für die weitere Arbeit aus.

#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);
}

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

Dies wurde getan, etwa hundert-tausend mal vor. du wirst die viel besser durch die Bestimmung der CPU-Kern-Anzahl C auf der Maschine, der bestimmt, wie viele Zeilen x Spalten-Vektor-Multiplikationen erforderlich sind, teilt sich die letztere durch die erstere (in etwa) und senden diese zu C threads Prozess unabhängig von den anderen. Alle modulo (extra-Vektoren bis zu C-1 ) gesendet werden als zusätzliche multipliziert, um die erste Reihe von threads. Sie werden hart gedrückt, um eine effizientere und einfacher Algorithmus, insbesondere wenn man absolut keine Verriegelung erforderlich ist, zu löschen.
Sorry, war mir nicht klar. Entsprechend der Belegung, muss es 1 thread für jede einzelne Multiplikation, die getan werden muss. Bedeutung, zum Beispiel Matrizen, die ich gab, wird es 18 threads 18 Multiplikationen. Es geht nicht darum, effizient zu sein. Es ist nur eine HW-übung.
Ja, ich nehme an, es muss nur eine übung. Das Konzept beeinträchtigt ziemlich schnell, wenn Sie etwas zu nehmen wie A[500][800] x B[800][1000]. Die größer es wird, desto mehr Zeit Sie verbringen ab Eintritt threads, wenn Sie nur könnten werden am Laufenden Band Multiplikationen. Ah gut. Viel Glück!
Wenn die Matrizen sind groß genug, möchten Sie vielleicht auch, um zu untersuchen Strassen-Algorithmus für die matrix-Multiplikation - und extra-Guthaben?

InformationsquelleAutor Kinru | 2013-03-16

Schreibe einen Kommentar