pborawski

omp mnozenie macierzy2.c

Nov 19th, 2012
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <omp.h>
  5. #define  NUM_LOOPS 50
  6. int main(int argc, char *argv[])
  7. {
  8.     double **A;
  9.     double *u, *v;
  10.     long rows = 6000, columns = 6000;
  11.     time_t start0, stop0;
  12.     double start1, stop1;
  13.     long i, j, k;
  14.  
  15.     // Inicjujemy wektory i macierz.
  16.     u = (double*)malloc(columns * sizeof(double));
  17.     v = (double*)malloc(rows * sizeof(double));
  18.     A = (double**)malloc(rows * sizeof(double*));
  19.     for (i = 0; i < rows; i++)
  20.         A[i] = (double*)malloc(columns * sizeof(double));
  21.  
  22.     // Wypełniamy wektor u oraz macierz A dowolnymi wartościami.
  23.     for (i = 0; i < columns; i++) {
  24.         u[i] = (double)(i / 1000.0f);
  25.         for ( j = 0; j < rows; j++ )
  26.             A[j][i] = (double)(i * j / 1000.0f);
  27.     }
  28.  
  29.     omp_set_num_threads(12); // Funkcja przyjmuje jako parametr liczbe watków ( moze przewyższać liczbe faktycznych rdzeni ) .
  30.  
  31.     start0 = time(NULL);
  32.     start1 = omp_get_wtime();
  33.     for (k = 0; k < NUM_LOOPS; k++) { // dyrektywa for powoduje że zrównoleglamy petle for
  34.         #pragma omp parallel for shared(A, v, u, rows, columns) private(i, j)
  35.         for (i = 0; i < rows; i++) { // wykonujemy mnozenie macierzy
  36.             v[i] = 0.0f;
  37.             for (j = 0; j < columns; j++)
  38.                 v[i]  = v[i] + A[i][j] * u[j];
  39.         }
  40.     }
  41.     stop0 = time(NULL);
  42.     stop1 = omp_get_wtime();
  43.     printf("Czas obliczen funkcja time(): %fs.\n", difftime(stop0,start0));
  44.     printf("Czas obliczen funkcja omp_get_wtime(): %lfs.\n", stop1-start1);
  45.  
  46.     // Zwalniamy pamięć.
  47.     free(u);
  48.     free(v);
  49.     for (i = 0; i < rows; i++)
  50.         free(A[i]);
  51.     free(A);
  52.  
  53.     return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment