Advertisement
piffy

Matrice threaddata

Aug 24th, 2014
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.54 KB | None | 0 0
  1. /********************************************************
  2.  * matrice_threads.c
  3.  *
  4.  * Il main genera un numero di thread pari al numero delle righe dell'array
  5.  * Ognuno di essi riceve un puntatore a una struct che contengono gli indici
  6.  * necessari per il calcolo. Tutti i thread possono essere eseguiti in parallelo
  7.  * senza problemi di race condition, per cui il miglioramento dipende solo dal PC
  8.  * utilizzato. Il main raccoglie tutti i thread ed esce.  
  9.  *
  10.  *
  11.  * Compilare con:
  12.  * gcc -pthread -Wall matrice_threads.c -o matrice_threads
  13.  * Tempo necessario: circa 2 secondi (con 1000 elementi).
  14.  * Per vedere più dettagli (lieve perdita di prestazioni)
  15.  * gcc -DDEBUG -pthread -Wall matrice_threads.c -o matrice_threads
  16.  */
  17.  
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <errno.h>
  21. #include "timer.h"
  22.  
  23. #include <pthread.h>
  24.  
  25. #define ARRAY_SIZE 1000
  26.  
  27. typedef int matrix_t[ARRAY_SIZE][ARRAY_SIZE];
  28.  
  29. typedef struct {
  30.   int       id;
  31.   int       size;
  32.   int       Arow;
  33.   int       Bcol;
  34.   matrix_t  *MA, *MB, *MC;
  35. } package_t;
  36.  
  37. matrix_t MA,MB,MC;
  38.  
  39.   /* Riempimento delle matrici */
  40. void initMatrices(int size,
  41.       matrix_t MA,
  42.       matrix_t MB)
  43. {
  44.   int row, column;
  45.   for (row = 0; row < size; row++) {
  46.     for (column = 0; column < size; column++) {
  47.       MA[row][column] = 1;
  48.     }
  49.   }
  50.   for (row = 0; row < size; row++) {
  51.     for (column = 0; column < size; column++) {
  52.       MB[row][column] = row + column + 1;
  53.     }
  54.   }
  55.   printf("Matrici pronte:\n");
  56. }
  57.  
  58.  
  59. /* Funzione di aiuto che calcola il prodotto di un'intera riga
  60.  * e pone il risultato nella matrice C */
  61.  
  62. void mult(int size, int row, matrix_t MA, matrix_t MB, matrix_t MC)
  63. {
  64.   int position, column;
  65.   for (column = 0; column < size; column++){
  66.       MC[row][column] = 0;
  67.           for(position = 0; position < size; position++) {
  68.             MC[row][column] += ( MA[row][position]  * MB[position][column] ) ;
  69.           }
  70.  }
  71. }
  72.  
  73.  
  74. /*
  75.  * Funzione che fa partire il calcolo di una riga.
  76.  */
  77. void *mult_worker(void *arg)
  78. {
  79.   package_t *p=(package_t *)arg;
  80.      #ifdef DEBUG
  81.         printf("Thread n. %d: calcola il prodotto della riga  %d di A e la colonna  %d di B\n", p->id, p->Arow, p->Bcol );
  82.      #endif
  83.     mult(p->size, p->Arow, *(p->MA), *(p->MB), *(p->MC));
  84.   free(p);
  85.  
  86.   return(NULL);
  87. }
  88.  
  89. int main(int argc, char **argv)
  90. {
  91.   int       size, row, num_threads, i;
  92.   pthread_t *threads;       /* array dinamica che contiene tutto gli id dei threads, in modo da poterli riunire tutti */
  93.   package_t *p;             /* elenco dei parametri da passare a ogni thread */
  94.   size = ARRAY_SIZE;
  95.  
  96.   /* creazione della matrice dinamica, un thread per ogni riga della matrice. */
  97.   threads = (pthread_t *)malloc(size*sizeof(pthread_t));
  98.   /* Inizializza le matrici */
  99.   initMatrices(size, MA, MB);
  100.   startTime();
  101.  
  102.   /*
  103.    * Calcolo del prodotto delle matrici, per riga e colonna.
  104.    * (Per dettagli http://it.wikipedia.org/wiki/Moltiplicazione_di_matrici)  
  105.    */
  106.   num_threads = 0;
  107.   for(row = 0; row < size; row++) {
  108.       p = (package_t *)malloc(sizeof(package_t));
  109.       p->id = num_threads;
  110.       p->size = size;
  111.       p->Arow = row;
  112.       p->Bcol = 0;
  113.       (p->MA) = &MA;
  114.       (p->MB) = &MB;
  115.       (p->MC) = &MC;
  116.      
  117.       pthread_create(&threads[num_threads], NULL, mult_worker,  (void *) p);
  118.       num_threads++;  
  119.   }
  120.  
  121.   /* Sincronizza il risultato */
  122.   for (i = 0; i < (size); i++) {
  123.     pthread_join(threads[i], NULL);
  124.     #ifdef DEBUG
  125.         printf("Thread %d riunito al main...\n", i);
  126.     #endif
  127.   }
  128.   stopTime();
  129.   elapsedTime();
  130.  
  131.   return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement