Matrixmultiplikation mit Threads
-
Hallo.
Ich komme bei folgendem Programm nicht weiter:
Die Matrix soll zeilenweise mit dem Vektor multipliziert werden, und dabei sollen
threads verwendet werden.Der erste Thread soll die erste Zeile der Matrix mit der ersten Zeile
des Vektors multiplizieren.Der zweite Thread die zweite Zeile usw..
Das Problem ist das Programm umzuschreiben und zu editieren
und zwar so, das dieses das auch macht.Listing:
/* * matrix_vector_serial.c * * A simple matrix multiplication program * (Matrix A x Vector b) => Vector c */ #include <stdio.h> #include <pthread.h> #include <sys/types.h> #define ARRAY_SIZE 10 #define NDIM 200 typedef int matrix_t[ARRAY_SIZE][ARRAY_SIZE]; typedef int vector_t[ARRAY_SIZE]; double a[NDIM][NDIM]; double b[NDIM][NDIM]; double c[NDIM][NDIM]; matrix_t A; vector_t b, c; /* * Routine to multiply a row of the matrix A by a vector b and * place element in resulting vector c */ typedef struct { int size; int row; double (A) [NDIM][NDIM],(b)[NDIM][NDIM], (c) [NDIM][NDIM]; }thread; void mult(int size, int row, matrix_t A, vector_t b, vector_t c) { int pos, t; t = 0; for(pos = 0; pos < size; pos++) t = t + A[row][pos] * b[pos]; //muss n-mal aufgerufen werden c[row] = t; } /* * Main: allocates matrix, assigns values, computes the results */ int main() { int size, row, col; /* Currently size hardwired to ARRAY_SIZE size */ size = ARRAY_SIZE; /* Fill in matrix values, currently values are hardwired */ for (row = 0; row < size; row++) for (col = 0; col < size; col++) A[row][col] = 1; /* Fill in vector values, current values are hardwired */ for (row = 0; row < size; row++) b[row] = 1; printf("The matrix A is\n"); for(row = 0; row < size; row ++) { for (col = 0; col < size; col++) printf("%3d ", A[row][col]); printf("\n"); } printf("The vector b is\n"); for(row = 0; row < size; row ++) printf("%3d \n", b[row]); /* Process vector by row */ for(row = 0; row < size; row++) mult(size, row, A, b, c); /* Print results */ printf("The resulting vector c is\n"); for(row = 0; row < size; row ++) printf("%3d \n", c[row]); return 0; }
MfG
kiyoto
-
kiyoto99 schrieb:
Ich komme bei folgendem Programm nicht weiter:
Aha. Und wir sollen raten? Eine Problembeschreibung wäre schon ganz hilfreich.
-
Benutze die Compiler Einstellungen damit hast du am wenigsten Probleme.
Sonst kannst du mit OpenMP arbeiten.
Generell kann man aber sagen dass es nicht gerade einfach ist Thread sichere Algorithmen zu schreiben. Deswegen wird meistens bei mathematischen Modulen explizit angegeben ob sie "Thread Safe" sind.
In diesem Fall, so wie du es vorschlägst wird es mMn keine Probleme geben. Dann musst du aber alle sonstigen Optimierungen ausschalten weil die innere Schleifenmultiplikation höchstwahrscheinlich ebenfalls vektorisiert wird.
Die Probleme kann man meistens auch nicht so trivial testen.
Geh vor dem Programmieren diese Beiträge durch (leider nur englisch):
http://software.intel.com/en-us/profile/336629/Beitrag: "Floating Points Aren't Real" zeigt es glaube ich am einfachsten dass man sich ziemlich schnell verirren kann.
------------------------------------------
Nachtrag:
Ich habe deinen Code mal ein wenig durchgesehen.
So zu implementieren ist nicht empfehlenswert. Verwende lieber eindimensionale Arrays vom Typ matrix[m*dim+n]. Damit lassen sich die Operationen wesentlich beschleunigen.
-
Weisst du denn, wie man einen Thread erstellt?
-
knivil schrieb:
Weisst du denn, wie man einen Thread erstellt?
Allgemein:
#include <pthread.h>
int pthread_create( pthread_t *thread,
const pthread_attr_t *attribute,
void *(*funktion)(void *),
void *argumente);speziell: nein wie?
-
Ich habe dir mal das erst beste Tutorial von google verlinkt: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
-
knivil schrieb:
Ich habe dir mal das erst beste Tutorial von google verlinkt: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
Thx