Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.75 KB | None | 0 0
  1. /* Matrizenmultiplikation - einfache Parallelisierung.
  2. / Es sollen so viele Faeden (POSIX-Threads) instanziiert werden, wie es
  3. / Zeilen in der Eingabe-Matrix gibt. Da die pthread_create-Funktion (siehe pthread_create(3)) nur einen
  4. / Parameter fuer die Uebergabe von Argumenten an die Thread-Funktion vorsieht, werden die Argumente
  5. / in der Praxis ueblicherweise mittels einer Strukturvariable (struct) uebergeben. Da jedoch unsere
  6. / Implementierung fuer die Aufgabe a2) mit nur einem Argument (naemlich der Matrix-Reihe "row") auskommt, koennen wir uns
  7. / das Struct sparen, muessen aber das Argument von Datentyp int in einen void-Zeiger und umgekehrt
  8. / ueberfuehren. Um Plattformunabhaengigkeit zu gewaehrleisten und Fehler zu vermeiden, sollte dazu der
  9. / Datentyp intptr_t verwendet werden, hier ein Beispiel:
  10. / void* argvoidptr = (void*)(intptr_t) argint
  11. /
  12. / Zum Nachlesen: pthread_create(3), pthread_join(3), pthread_exit(3).
  13. /
  14. / Um das Programm mit GCC zu kompilieren: "gcc -std=c11 -Wall -pthread -march=native -O3 a2_parallel.c -o a2p".
  15. / Um das Programm mit Valgrind auf Speicherfehler zu ueberpruefen: "valgrind --leak-check=full -v ./a2p".
  16. / |_ Hier interessant sind definitely, indirectly und (eventuell) possibly lost. Still reachable koennt Ihr ignorieren.
  17. /
  18. */
  19.  
  20. #include <stdio.h> // u.a. fuer printf()
  21. #include <stdlib.h> // u.a. fuer rand()
  22. #include <time.h> // u.a. fuer time()
  23. #include <sys/time.h> // u.a. fuer gettimeofday()
  24. #include <sys/sysinfo.h> // u.a. fuer get_nprocs()
  25. #include <pthread.h> // u.a. fuer pthread_create()
  26. #include <stdint.h> // u.a. fuer intptr_t
  27.  
  28. // Matrizen nach der Berechnung mit ausgeben? 1 ja, 0 nein.
  29. #define PRINT_MATRICES 0
  30.  
  31. // Anzahl der Matrix-Zeilen. Da wir von quadratischen Matrizen ausgehen,
  32. // entspricht das der Anzahl der Matrix-Spalten
  33. #define ARRAY_SIZE 1000
  34.  
  35. // Zudem definieren wir uns einen neuen Datentyp matrix_t.
  36. typedef int matrix_t[ARRAY_SIZE * ARRAY_SIZE];
  37. matrix_t MA,MB,MBT,MC;
  38.  
  39. /* *** Dein CODE hier ***
  40. / Deklariere ein Feld (array) fuer die Verwaltung von Threads. Dimensioniere es so,
  41. / dass ein Thread pro Matrix-Zeile gespeichert werden kann.
  42. */
  43. pthread_t tids[ARRAY_SIZE];
  44.  
  45.  
  46. /* Funktion fuer die zufallsbasierte Initialisierung einer Matrix */
  47. void init_matrix(matrix_t matrix) {
  48. int row,column, size = ARRAY_SIZE;
  49. for (row=0; row < size; row++) {
  50. for (column=0; column < size; column++) {
  51. (matrix[row * size + column]) = rand() % 10 + 1; // Wir nutzen den Modulo-Operator, um den Wert der Zufallszahlen einzugrenzen.
  52. } // Hier werden Zahlen zwischen 1 und 10 "gewuerfelt".
  53. }
  54. }
  55.  
  56. /* Funktion fuer das Ausgeben einer Matrix */
  57. void print_matrix(matrix_t matrix) {
  58. int row, column, size = ARRAY_SIZE;
  59. printf("MATRIX:\n");
  60. for(row = 0; row < size; row ++) {
  61. for (column = 0; column < size; column++) {
  62. printf("%d ", (matrix[row * size + column]));
  63. }
  64. printf("\n");
  65. }
  66. }
  67.  
  68. /* Die Thread-Funktion zur Multiplikation einer MA-Zeile mit MB-Spalten (MBT-Zeilen).
  69. / Die Ergebnisse der Multiplikationen werden in der Zielmatrix unter MC[Zeile] abgelegt.
  70. */
  71. void* mmult(void* r){
  72. int row = (intptr_t) r; // Matrix-Zeile
  73. int index; // Bestimmt die Position der zu multiplizierenden Faktoren
  74. int column, tmp, size = ARRAY_SIZE;
  75. for(column = 0; column < size; column++){ // Spalte der MB-Matrix (d.h. Zeile der MBT-Matrix)
  76. tmp = 0;
  77. for(index = 0; index < size; index++){
  78. tmp += MA[row * size + index] * MBT[column * size + index];
  79. }
  80. MC[row * size + column] = tmp;
  81. }
  82. /* *** Dein CODE hier ***
  83. / Beende diesen Faden nach getaner Arbeit.
  84. */
  85. pthread_exit(0);
  86.  
  87. }
  88.  
  89. /* Einsprungpunkt fuer das Programm */
  90. int main(void) {
  91. int size = ARRAY_SIZE, row, column;
  92. struct timeval start, end;
  93. double exectime;
  94.  
  95. printf("Es werden (#%d) Faeden instanziiert. Dieses System verfuegt ueber (#%d) Prozessoren.\n", size, get_nprocs());
  96.  
  97. // Initialisiere den Zufallszahl-Generator (seed), um Zufallszahlen generieren zu koennen.
  98. // Die Initialisierung erfolgt ueber einen Zeitstempel.
  99. srand(time(NULL));
  100.  
  101. // Initialisiere zufallsbasiert die Matrizen MA und MB
  102. init_matrix(MA);
  103. init_matrix(MB);
  104.  
  105. // Zeitmessung
  106. gettimeofday(&start, NULL);
  107.  
  108. //Berechne die transponierte Matrix MBT aus MB
  109. for(row = 0; row < size; row++)
  110. for(column = 0; column < size; column++)
  111. MBT[row*size+column] = MB[column * size + row];
  112.  
  113. /* *** Dein CODE hier ***
  114. / Erstelle so viele Faeden, wie Zeilen in der Eingabematrix existieren. Uebergebe den Faden den
  115. / passenden Funktionszeiger. Ueberpruefe den Rueckgabewert.
  116. / Gebe im Fehlerfall eine Fehlermeldung aus.
  117. */
  118. int i;
  119. for(i=0;i<ARRAY_SIZE;i++){
  120. pthread_attr_t attr;
  121. int x = i;
  122. pthread_create(&tids[i],NULL,mmult,x);
  123. pthread_join(tids[i],NULL);
  124. }
  125.  
  126. /* *** Dein CODE hier ***
  127. / Blockiere/Warte in einer Schleife bis alle erstellten Faeden beendet worden sind.
  128. / Ueberpruefe den Rueckgabewert der einzelnen Faeden und gebe im Fehlerfall eine
  129. / Fehlermeldung aus.
  130. */
  131.  
  132. // Zeitmessung
  133. gettimeofday(&end, NULL);
  134.  
  135. if(PRINT_MATRICES){
  136. print_matrix(MA);
  137. print_matrix(MB);
  138. print_matrix(MBT);
  139. print_matrix(MC);
  140. }
  141. exectime = (end.tv_sec - start.tv_sec) * 1000000.0; // sec to us
  142. exectime += (end.tv_usec - start.tv_usec); // us
  143.  
  144. printf("Anzahl Threads %d, Matrix-Groesse %d X %d, Ausfuehrungszeit: %lu [us], %f [ms], %f [s]\n",
  145. size, size, size, (unsigned long int)exectime, exectime/1000, exectime/1000000);
  146. return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement