Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.07 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #include <cstdlib>
  6. #include "omp.h"
  7.  
  8.  
  9.  
  10. #define USE_MULTIPLE_THREADS true
  11. #define MAXTHREADS 128
  12. int NumThreads;
  13. double start;
  14. using namespace std;
  15. static const int ROWS = 1000;     // liczba wierszy macierzy
  16. static const int COLUMNS = 1000;  // lizba kolumn macierzy
  17.  
  18. float matrix_a[ROWS][COLUMNS];    // lewy operand
  19. float matrix_b[ROWS][COLUMNS];    // prawy operand
  20. float matrix_r[ROWS][COLUMNS];    // wynik
  21. float matrix_r2[ROWS][COLUMNS];
  22.  
  23.  
  24. FILE *result_file;
  25.  
  26. void initialize_matrices()
  27. {
  28.     // zdefiniowanie zawarosci poczatkowej macierzy
  29.     //#pragma omp parallel for
  30.     for (int i = 0; i < ROWS; i++) {
  31.         for (int j = 0; j < COLUMNS; j++) {
  32.             matrix_a[i][j] = (float)rand() / RAND_MAX;
  33.             matrix_b[i][j] = (float)rand() / RAND_MAX;
  34.             matrix_r[i][j] = 0.0;
  35.         }
  36.     }
  37. }
  38.  
  39. void initialize_matricesZ()
  40. {
  41.     // zdefiniowanie zawarosci poczatkowej macierzy
  42. //#pragma omp parallel for
  43.     for (int i = 0; i < ROWS; i++) {
  44.         for (int j = 0; j < COLUMNS; j++) {
  45.             matrix_r[i][j] = 0.0;
  46.             matrix_r2[i][j] = 0.0;
  47.  
  48.         }
  49.     }
  50. }
  51. void print_result()
  52. {
  53.     // wydruk wyniku
  54.     for (int i = 0; i < ROWS; i++) {
  55.         for (int j = 0; j < COLUMNS; j++) {
  56.             fprintf(result_file, "%6.4f ", matrix_r[i][j]);
  57.         }
  58.         fprintf(result_file, "\n");
  59.     }
  60. }
  61.  
  62. bool result_match() {
  63.     for (int i = 0; i < ROWS; i++)
  64.         for (int j = 0; j < COLUMNS; j++)
  65.             if (matrix_r[i][j] != matrix_r2[i][j])
  66.                 return false;
  67.     return true;
  68. }
  69.  
  70.  
  71. void multiply_matrices_Seq()
  72. {
  73.         for (int i = 0; i < ROWS; i++) {
  74.             for (int j = 0; j < COLUMNS; j++) {
  75.                 for (int k = 0; k < COLUMNS; k++) {
  76.                     matrix_r2[i][j] = matrix_a[i][k] * matrix_b[k][j];
  77.                 }
  78.         }
  79.     }
  80. }
  81. /*
  82. void multiply_matrices_JIK()
  83. {
  84.     // mnozenie macierzy
  85. #pragma omp parallel for
  86.     for (int j = 0; j < COLUMNS; j++) {
  87.         for (int i = 0; i < ROWS; i++) {
  88.             float sum = 0.0;
  89.             for (int k = 0; k < COLUMNS; k++) {
  90.                 sum += matrix_a[i][k] * matrix_b[k][j];
  91.             }
  92.             matrix_r[i][j] = sum;
  93.         }
  94.     }
  95. }
  96. */
  97. ///*
  98. void multiply_matrices_JIK()
  99. {
  100.     // mnozenie macierzy
  101.  
  102. #pragma omp parallel for
  103.     for (int j = 0; j < COLUMNS; j++) {
  104.         for (int i = 0; i < ROWS; i++) {
  105.             for (int k = 0; k < COLUMNS; k++) {
  106.                 matrix_r[i][j] = matrix_a[i][k] * matrix_b[k][j];
  107.             }
  108.         }
  109.     }
  110. }
  111. //*/
  112.  
  113.  
  114. void multiply_matrices_ijk_ikj(int r = 50) {
  115. #pragma omp parallel for
  116.     for (int i = 0; i < ROWS; i += r)
  117.         for (int j = 0; j < COLUMNS; j += r)
  118.             for (int k = 0; k < COLUMNS; k += r)
  119.                 for (int ii = i; ii < i + r; ii++)
  120.                     for (int kk = k; kk < k + r; kk++)
  121.                         for (int jj = j; jj < j + r; jj++)
  122.                                         matrix_r2[ii][jj] += matrix_a[ii][kk] * matrix_b[kk][jj];
  123. }
  124.  
  125. void print_elapsed_time()
  126. {
  127.     double elapsed;
  128.     double resolution;
  129.  
  130.     // wyznaczenie i zapisanie czasu przetwarzania
  131.     elapsed = (double)clock() / CLK_TCK;
  132.     resolution = 1.0 / CLK_TCK;
  133.     printf("Czas: %8.4f sec \n",
  134.         elapsed - start);
  135.  
  136.     fprintf(result_file,
  137.         "Czas wykonania programu: %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
  138.         elapsed - start, resolution);
  139. }
  140.  
  141. int main(int argc, char* argv[])
  142. {
  143.     //   start = (double) clock() / CLK_TCK ;
  144.     if ((result_file = fopen("classic.txt", "a")) == NULL) {
  145.         fprintf(stderr, "nie mozna otworzyc pliku wyniku \n");
  146.         perror("classic");
  147.         return(EXIT_FAILURE);
  148.     }
  149.  
  150.  
  151.     //Determine the number of threads to use
  152.     if (USE_MULTIPLE_THREADS) {
  153.         SYSTEM_INFO SysInfo;
  154.         GetSystemInfo(&SysInfo);
  155.         NumThreads = SysInfo.dwNumberOfProcessors;
  156.         if (NumThreads > MAXTHREADS)
  157.             NumThreads = MAXTHREADS;
  158.     }
  159.     else
  160.         NumThreads = 1;
  161.  
  162.     fprintf(result_file, "Klasyczny algorytm mnozenia macierzy, liczba watkow %d \n", NumThreads);
  163.     printf("liczba watkow  = %d\n\n", NumThreads);
  164.    
  165.     initialize_matricesZ();
  166.     start = (double)clock() / CLK_TCK;
  167.     multiply_matrices_JIK();
  168.     printf("JKI ");
  169.     print_elapsed_time();
  170.    
  171.     start = (double)clock() / CLK_TCK;
  172.     //multiply_matrices_ijk_ikj(10);
  173.     multiply_matrices_Seq();
  174.     printf("Seq JKI ");
  175.     print_elapsed_time();
  176.    
  177.     if (result_match()) {
  178.         printf("success!\n");
  179.     }
  180.  
  181.  
  182.     fclose(result_file);
  183.     return(0);
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement