Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.53 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <omp.h>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <time.h>
  7. #include <stdio.h>
  8.  
  9. using namespace std;
  10.  
  11. #define N 600
  12. #define R 100
  13. #define NUM_OF_THREADS 4
  14.  
  15. FILE *result_file;
  16.  
  17. float matrix_a[N][N];
  18. float matrix_b[N][N];
  19. float matrix_r[N][N];
  20. auto threeForTempMatrix = new float[10][N][N];
  21.  
  22. void initialize_matrices()
  23. {
  24.     // zdefiniowanie zawarosci poczatkowej macierzy
  25.     //#pragma omp parallel for
  26.     for (int i = 0; i < N; i++) {
  27.         for (int j = 0; j < N; j++) {
  28.             matrix_a[i][j] = (float)rand() / RAND_MAX;
  29.             matrix_b[i][j] = (float)rand() / RAND_MAX;
  30.             matrix_r[i][j] = 0.0;
  31.         }
  32.     }
  33. }
  34.  
  35. void initialize_matricesZ()
  36. {
  37.     // zdefiniowanie zawarosci poczatkowej macierzy
  38. #pragma omp parallel for
  39.     for (int i = 0; i < N; i++) {
  40.         for (int j = 0; j < N; j++) {
  41.             matrix_r[i][j] = 0.0;
  42.         }
  43.     }
  44. }
  45.  
  46. void initialize_temp()
  47. {
  48.     // zdefiniowanie zawarosci poczatkowej macierzy
  49. #pragma omp parallel for
  50.     for (int k = 0; k < 6; k++) {
  51.         for (int i = 0; i < N; i++) {
  52.             for (int j = 0; j < N; j++) {
  53.                 threeForTempMatrix[k][i][j] = 0.0;
  54.             }
  55.         }
  56.     }
  57. }
  58.  
  59. void threeLoops() {
  60. #pragma omp parallel
  61.     {
  62.         int num = omp_get_thread_num();
  63. #pragma omp for nowait
  64.         for (int k = 0; k < N; k++) {
  65.             for (int i = 0; i < N; i++) {
  66.                 for (int j = 0; j < N; j++) {
  67.                     threeForTempMatrix[num][i][j] += matrix_a[i][k] * matrix_b[k][j];
  68.                 }
  69.             }
  70.         }
  71.  
  72.         for (int i = 0; i < N; i++) {
  73.             for (int j = 0; j < N; j++) {
  74. #pragma omp atomic
  75.                 matrix_r[i][j] += threeForTempMatrix[num][i][j];
  76.             }
  77.         }
  78.     }
  79.  
  80. }
  81.  
  82. void sixLoops() {
  83.     for (int i = 0; i < N; i += R)
  84. #pragma omp parallel for
  85.         for (int j = 0; j < N; j += R)
  86.             for (int k = 0; k < N; k += R)
  87.                 for (int ii = i; ii < i + R; ii++)
  88.                     for (int kk = k; kk < k + R; kk++)
  89.                         for (int jj = j; jj < j + R; jj++)
  90.                             matrix_r[ii][jj] += matrix_a[ii][kk] * matrix_b[kk][jj];
  91. }
  92.  
  93. void sequenceLoopsSmall() {
  94.     for (int i = 0; i < N; i++)
  95.         for (int k = 0; k < N; k++)
  96.             for (int j = 0; j < N; j++)
  97.                 matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];
  98. }
  99.  
  100. void sequenceLoopsBig() {
  101.     for (int i = 0; i < N; i += R)
  102.         for (int j = 0; j < N; j += R)
  103.             for (int k = 0; k < N; k += R)
  104.                 for (int ii = i; ii < i + R; ii++)
  105.                     for (int kk = k; kk < k + R; kk++)
  106.                         for (int jj = j; jj < j + R; jj++)
  107.                             matrix_r[ii][jj] += matrix_a[ii][kk] * matrix_b[kk][jj];
  108. }
  109.  
  110. int main() {
  111.     srand(time(NULL));
  112.  
  113.     if (fopen_s(&result_file, "results.txt", "a") < 0) {
  114.         fprintf(stderr, "nie mozna otworzyc pliku wyniku \n");
  115.         perror("results");
  116.         return(EXIT_FAILURE);
  117.     }
  118.  
  119.     omp_set_num_threads(NUM_OF_THREADS);
  120.  
  121.     fprintf(result_file, "N for 3-LOOP: %d\n", N);
  122.     fprintf(result_file, "N for 6-LOOP: %d\n", N);
  123.     fprintf(result_file, "R for 6-LOOP: %d\n", R);
  124.     fprintf(result_file, "NUM_OF_THREADS : %d\n", NUM_OF_THREADS);
  125.  
  126.     initialize_matrices();
  127.     cout << "Matrices are prepared..." << endl;
  128.  
  129.     initialize_matricesZ();
  130.     double start = (double)clock() / CLK_TCK;
  131.     sequenceLoopsSmall();
  132.     std::cout << "\n" << matrix_r[0][0] << "\n";
  133.     double end = (double)clock() / CLK_TCK;
  134.     printf("3-loops sequence processing: %8.4f sec \n", end - start);
  135.     fprintf(result_file,
  136.         "3-loops sequence processing : %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
  137.         end - start, 1.0 / CLK_TCK);
  138.  
  139.     initialize_matricesZ();
  140.     start = (double)clock() / CLK_TCK;
  141.     sequenceLoopsBig();
  142.     std::cout << "\n" << matrix_r[0][0] << "\n";
  143.     end = (double)clock() / CLK_TCK;
  144.     printf("6-loops sequence processing: %8.4f sec \n", end - start);
  145.     fprintf(result_file,
  146.         "6-loops sequence processing : %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
  147.         end - start, 1.0 / CLK_TCK);
  148.  
  149.     initialize_matricesZ();
  150.     initialize_temp();
  151.     start = (double)clock() / CLK_TCK;
  152.     threeLoops();
  153.     std::cout << "\n" << matrix_r[0][0] << "\n";
  154.     end = (double)clock() / CLK_TCK;
  155.     printf("3-loops parallel processing: %8.4f sec \n", end - start);
  156.     fprintf(result_file,
  157.         "3-loops parallel processing : %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
  158.         end - start, 1.0 / CLK_TCK);
  159.  
  160.     initialize_matricesZ();
  161.     start = (double)clock() / CLK_TCK;
  162.     sixLoops();
  163.     std::cout << "\n" << matrix_r[0][0] << "\n";
  164.     end = (double)clock() / CLK_TCK;
  165.     printf("6-loops parallel processing: %8.4f sec \n", end - start);
  166.     fprintf(result_file,
  167.         "6-loops parallel processing : %8.4f sec (%6.4f sec rozdzielczosc pomiaru)\n",
  168.         end - start, 1.0 / CLK_TCK);
  169.  
  170.     fprintf(result_file, "===========================================\n");
  171.     char c;
  172.     std::cin >> c;
  173.     fclose(result_file);
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement