Facebook
From Sharp Cassowary, 9 Years ago, written in C.
This paste is a reply to Untitled from Queen Wolf - view diff
Embed
Download Paste or View Raw
Hits: 700
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define  NUM_LOOPS 50
  6.  
  7. int
  8. main(int argc, char *argv[])
  9. {
  10.     double **A;
  11.     double *u, *v;
  12.     long rows = 5000, columns = 5000;
  13.     time_t begin_t, end_t;
  14.     long i, j, k;
  15.  
  16.     // Inicjujemy wektory i macierz.
  17.     u = (double*)malloc(columns * sizeof(double));
  18.     v = (double*)malloc(rows * sizeof(double));
  19.  
  20.     A = (double**)malloc(rows * sizeof(double*));
  21.  
  22.     for (i = 0; i < rows; i++)
  23.         A[i] = (double*)malloc(columns * sizeof(double));
  24.  
  25.     // Wypełniamy wektor u oraz macierz A dowolnymi wartościami.
  26.     for (i = 0; i < columns; i++) {
  27.         u[i] = (double)(i / 1000.0f);
  28.  
  29.         for ( j = 0; j < rows; j++ )
  30.             A[j][i] = (double)(i * j / 1000.0f);
  31.     }
  32.  
  33.     begin_t = time(NULL);
  34.  
  35.     // Pętla zewnętrzna.
  36.     for (k = 0; k < NUM_LOOPS; k++) {
  37.         // Obliczamy v = A*u z wykorzystaniem dyrektyw OpenMP.
  38.         #pragma omp parallel for shared(A, v, u, rows, columns) private(i, j)
  39.         for (i = 0; i < rows; i++) {
  40.             v[i] = 0.0f;
  41.             for (j = 0; j < columns; j++)
  42.                 v[i]  = v[i] + A[i][j] * u[j];
  43.         }
  44.     }
  45.  
  46.     end_t = time(NULL);
  47.  
  48.     printf("Czas obliczen: %f.\n", difftime(end_t, begin_t));
  49.  
  50.     // Zwalniamy pamięć.
  51.     free(u);
  52.     free(v);
  53.  
  54.     for (i = 0; i < rows; i++)
  55.         free(A[i]);
  56.  
  57.     free(A);
  58.  
  59.     return 0;
  60. }