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/
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, haw viele threads, die Sie benötigen würden, um Versand und ich bin auch nicht sicher, ob Sie verwenden würde später beitreten, um Sie abzuholen. Ich nehme an, Sie sind in C hier, so würde ich die thread-id als einen Weg, um die Zeile zu verarbeiten, .. so etwas wie :
Wo ich vermute, dass jeder thread aufnehmen wird, die entsprechende Zeile von Daten in der pointer - *row, die hat einen festgelegten Typ foo. Eine Reihe von integers oder floats oder auch komplexe Typen. Was auch immer Sie brauchen, um passieren, um den Faden.
Dann in Ihrem Haupt-code-segment so etwas wie :
Dann der Versand der threads mit so etwas wie :
Dann später :
Aber die eigentliche Arbeit muss getan werden, thr_rowcrunch( void *parm ) erhält die Zeile von Daten, und dann in jedem thread nur weiß seinen eigenen thread-Anzahl. Die Eingeweide von dem, was Sie tun, ausgelöst thread kann ich jedoch nur erahnen.
Nur versuchen, hier zu helfen, nicht sicher wenn das ist klar.
Die konkrete Eingabe der Daten ist variabel. Für die Aufgabe, die wir tun müssen, einige Datei-I/O-zu Lesen in der Matrizen-und dann das Ergebnis. Nicht wirklich relevant für meine Frage. Da sollte der code keine Rolle, abhängig von den Matrizen habe ich das Beispiel gab ich in meinem ursprünglichen Beitrag, um zu versuchen und erhalten diese zu arbeiten.
InformationsquelleAutor paul lanken