Cawa245

Untitled

Dec 10th, 2020
887
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #pragma clang diagnostic push
  2. #pragma ide diagnostic ignored "openmp-use-default-none"
  3. #include <iostream>
  4. #include <omp.h>
  5. #include <iostream>
  6. #include <chrono>
  7. #include <vector>
  8. #include <random>
  9.  
  10. #define N 100
  11.  
  12. using namespace std;
  13.  
  14. vector<int> randomVector(size_t size);
  15.  
  16.  
  17. void fillS(int(*a)[N]) {
  18.     for (int i = 0; i < N; i++) {
  19.         for (int j = 0; j < N; j++) {
  20.             a[i][j] = rand() % 10 + 1;
  21.         }
  22.     }
  23. }
  24.  
  25. int MatrixTask() {
  26.     vector<int> v1(N);
  27.     vector<int> v2(N);
  28.     v1 = randomVector(N);
  29.     v2 = randomVector(N);
  30.  
  31.  
  32.     double start = omp_get_wtime();
  33.     std::chrono::time_point<std::chrono::high_resolution_clock> start7 = std::chrono::high_resolution_clock::now();
  34. #pragma omp parallel num_threads(4)
  35.     transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), plus<int>());
  36.     std::chrono::time_point<std::chrono::high_resolution_clock> end7 = std::chrono::high_resolution_clock::now();
  37.     double end = omp_get_wtime();
  38.  
  39.     cout << "parallel vectors " << (end - start) << "time: "
  40.          << chrono::duration_cast<chrono::microseconds>(end7 - start7).count() << " microsec\n";
  41.  
  42.     vector<int> v3(N);
  43.     vector<int> v4(N);
  44.     v3 = randomVector(N);
  45.     v4 = randomVector(N);
  46.  
  47.     double start2 = omp_get_wtime();
  48.     std::chrono::time_point<std::chrono::high_resolution_clock> start8 = std::chrono::high_resolution_clock::now();
  49.     transform(v3.begin(), v3.end(), v4.begin(), v3.begin(), plus<int>());
  50.     std::chrono::time_point<std::chrono::high_resolution_clock> end8 = std::chrono::high_resolution_clock::now();
  51.     double end2 = omp_get_wtime();
  52.     cout << "not parallel vectors " << (end2 - start2) << "time: "
  53.          << chrono::duration_cast<chrono::microseconds>(end8 - start8).count() << " microsec\n";
  54.  
  55.     int matrix1[N][N];
  56.     int matrix2[N][N];
  57.     int matrix3[N][N];
  58.  
  59.  
  60.     fillS(matrix1);
  61.     fillS(matrix2);
  62.  
  63.     std::chrono::time_point<std::chrono::high_resolution_clock> start9 = std::chrono::high_resolution_clock::now();
  64.     double start3 = omp_get_wtime();
  65. #pragma omp parallel for num_threads(4)
  66.     for (int i = 0; i < N; i++) {
  67.         for (int k = 0; k < N; k++) {
  68.             for (int j = 0; j < N; j++) {
  69.                 matrix3[i][j] += matrix1[i][k] * matrix2[k][j];
  70.             }
  71.         }
  72.     }
  73.     double end3 = omp_get_wtime();
  74.  
  75.     std::chrono::time_point<std::chrono::high_resolution_clock> end9 = std::chrono::high_resolution_clock::now();
  76.     cout << "parallel matrix " << (end3 - start3) << "time: "
  77.          << chrono::duration_cast<chrono::microseconds>(end9 - start9).count() << " microsec\n";
  78.  
  79.  
  80. //Умножение матриц
  81.     int matrix4[N][N];
  82.     int matrix5[N][N];
  83.     int matrix6[N][N];
  84.  
  85.     fillS(matrix4);
  86.     fillS(matrix5);
  87.  
  88.     double start4 = omp_get_wtime();
  89.     std::chrono::time_point<std::chrono::high_resolution_clock> start10 = std::chrono::high_resolution_clock::now();
  90.     for (int i = 0; i < N; i++) {
  91.         for (int k = 0; k < N; k++) {
  92.             for (int j = 0; j < N; j++) {
  93.                 matrix6[i][j] += matrix4[i][k] * matrix5[k][j];
  94.             }
  95.         }
  96.     }
  97.     std::chrono::time_point<std::chrono::high_resolution_clock> end10 = std::chrono::high_resolution_clock::now();
  98.     double end4 = omp_get_wtime();
  99.     cout << "not parallel matrix " << (end4 - start4) << "time: "
  100.          << chrono::duration_cast<chrono::microseconds>(end10 - start10).count() << " microsec\n";
  101.     return 0;
  102.  
  103. }
  104.  
  105. vector<int> randomVector(size_t size) {
  106.     vector<int> v(size);
  107.     generate(v.begin(), v.end(), std::rand);
  108.     return v;
  109. }
  110.  
  111. #pragma clang diagnostic pop
Advertisement
Add Comment
Please, Sign In to add comment