Advertisement
codegod313

APK #2 (Sasha)

Mar 18th, 2021
891
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include <ctime>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <numeric>
  6. #include <chrono>
  7. #define sizeMatrix 300
  8. #define cycleValue 100000
  9.  
  10. #pragma optimize("", off)
  11. clock_t MatrixFunction1(int matrix1[sizeMatrix][sizeMatrix], int matrix2[sizeMatrix][sizeMatrix]) {
  12.     clock_t begin = clock();
  13.     for (int k = 0; k < cycleValue; k++) {
  14.         for (int i = 0; i < sizeMatrix; i++) {
  15.             for (int j = 0; j < sizeMatrix; j++) {
  16.                 matrix2[i][j] = matrix1[i][j];
  17.  
  18.             }
  19.         }
  20.     }
  21.     clock_t end = clock();
  22.     return end - begin;
  23. }
  24. #pragma optimize("", on)
  25.  
  26. clock_t mama(int matrix1[sizeMatrix][sizeMatrix], int matrix2[sizeMatrix][sizeMatrix])
  27. {
  28.     clock_t begin1 = clock();
  29.     for (int k = 0; k < cycleValue; k++) {
  30.         for (int i = 0; i < sizeMatrix; i++) {
  31.             for (int j = 0; j < sizeMatrix; j++) {
  32.                 matrix2[i][j] = matrix1[i][j];
  33.  
  34.             }
  35.         }
  36.     }
  37.     clock_t end1 = clock();
  38.     return end1 - begin1;
  39. }
  40.  
  41.  
  42. bool checkAnswer(int matrix1[sizeMatrix][sizeMatrix], int matrix2[sizeMatrix][sizeMatrix]) {
  43.     for (int i = 0; i < sizeMatrix; i++) {
  44.         for (int j = 0; j < sizeMatrix; j++) {
  45.             if (matrix2[i][j] != matrix1[i][j]) {
  46.                 return false;
  47.                 break;
  48.  
  49.             }
  50.         }
  51.     }
  52.     return true;
  53. }
  54.  
  55. int main()
  56. {
  57.     int intSize = sizeof(int);
  58.     int doubleIntSize = sizeof(int) * 2;
  59.     srand(time(NULL));
  60.     int matrix1[sizeMatrix][sizeMatrix];
  61.     int matrix2[sizeMatrix][sizeMatrix];
  62.  
  63.  
  64.     for (int i = 0; i < sizeMatrix; i++) {
  65.         for (int j = 0; j < sizeMatrix; j++) {
  66.             matrix1[i][j] = rand() % 100;
  67.         }
  68.     }
  69.     if (!checkAnswer(matrix1, matrix2))
  70.     {
  71.         printf("Cloun\n");
  72.     }
  73.  
  74.     clock_t begin2 = clock();
  75.    
  76.     for (int c = 0; c < cycleValue; c++) {
  77.         _asm {
  78.             xor esi, esi
  79.             mov al, sizeMatrix
  80.             mov bl, sizeMatrix
  81.             mul bl
  82.             mov ecx, eax
  83.             loop1 :
  84.                 mov edx, matrix1[esi]
  85.                 mov matrix2[esi], edx
  86.                 add esi, 4
  87.                 loop loop1
  88.  
  89.  
  90.         }
  91.     }
  92.     clock_t end2 = clock();
  93.     if (!checkAnswer(matrix1, matrix2))
  94.     {
  95.         printf("Cloun\n");
  96.     }
  97.     clock_t begin3 = clock();
  98.     int Counter = sizeMatrix * sizeMatrix * intSize * doubleIntSize / 64;
  99.  
  100.     for (int c = 0; c < cycleValue; c++) {
  101.         _asm {
  102.             xor esi,esi
  103.             mov ebx, Counter
  104.  
  105.             cycle:
  106.             movq MM1, matrix1[esi]
  107.             movq matrix2[esi],MM1
  108.             add esi,8
  109.                 dec ebx
  110.                 cmp ebx,0
  111.                 jne cycle
  112.         }
  113.     }
  114.     clock_t end3 = clock();
  115.  
  116.     if (!checkAnswer(matrix1, matrix2))
  117.     {
  118.         printf("Cloun\n");
  119.     }
  120.     clock_t asd = MatrixFunction1(matrix1, matrix2);
  121.     double time = asd / CLOCKS_PER_SEC;
  122.     //time /= CLOCKS_PER_SEC;
  123.     std::cout << "Time in c without optimize : " << time << std::endl;
  124.     std::cout << "Time in c without optimize : " << time << std::endl;
  125.  
  126.     double time1 = (double)(mama(matrix1,matrix2)) / CLOCKS_PER_SEC;
  127.     //printf("Time on c with optimization: %lf ", time1);
  128.     std::cout << "Time on c with optimization : " << time1 << std::endl;
  129.     double time2 = (double)(end2 - begin2) / CLOCKS_PER_SEC;
  130.     //printf("Time on asm: %lf ", time2);
  131.     std::cout << "Time on asm: " << time2 << std::endl;
  132.     double time3 = (double)(end3 - begin3) / CLOCKS_PER_SEC;
  133.     //printf("Time on asm with MMX: %lf ", time3);
  134.     std::cout << "Time on asm with MMX:  " << time3 << std::endl;
  135.  
  136.     return 0;
  137. }
  138.  
  139.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement