Advertisement
kolbka_

Untitled

Apr 26th, 2023
1,014
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <unistd.h>
  3. #include <sys/mman.h>
  4. #include <fcntl.h>
  5. #include <vector>
  6. #include <cstdint>
  7.  
  8. bool flag = false;
  9.  
  10. std::vector<uint32_t> mult_matrix(const std::vector<uint32_t> &one, const std::vector<uint32_t> &two, uint32_t size) {
  11.  
  12.     auto result = std::vector<uint32_t>(size * size);
  13.     for (int i = 0; i < size; i++) {
  14.         for (int j = 0; j < size; j++) { // col
  15.             for (int k = 0; k < size; k++) {
  16.                 result[i * size + j] += one[i * size + k] * two[j + size * k];
  17.             }
  18.         }
  19.     }
  20.     return result;
  21. }
  22.  
  23. std::vector<uint32_t> get_one_matrix(uint32_t size) {
  24.     std::vector<uint32_t> result(size * size, 0);
  25.     for (int i = 0; i < size; i++) {
  26.         result[i * size + i] = 1;
  27.     }
  28.     return result;
  29. }
  30.  
  31. std::vector<uint32_t> binpow(const std::vector<uint32_t> &a, uint32_t n, uint32_t size) {
  32.     if (n == 0) {
  33.         return get_one_matrix(size);
  34.     }
  35.     if (n % 2 == 1) {
  36. //        if (flag) std::cout << "[1] before mult " << n << std::endl;
  37.         auto res = mult_matrix(binpow(a, n - 1, size), a, size);
  38. //        if (flag) {
  39. //            std::cout << "[1] after mult " << n << std::endl;
  40. //            for (int i = 0; i < 10; i++) {
  41. //                std::cout << res[i] << " ";
  42. //            }
  43. //            std::cout << '\n';
  44. //        }
  45.         return res;
  46.     } else {
  47. //        if (flag) std::cout << "[2] before mult " << n << std::endl;
  48.         auto b = binpow(a, n / 2, size);
  49.  
  50. //        if (flag) {
  51. //            std::cout << "[2] b: " << n << std::endl;
  52. //            for (int i = 0; i < 10; i++) {
  53. //                std::cout << b[i] << " ";
  54. //            }
  55. //            std::cout << '\n';
  56. //        }
  57.  
  58.         auto res = mult_matrix(b, b, size);
  59.  
  60. //        if (flag) {
  61. //            std::cout << "[2] after mult " << n << std::endl;
  62. //            for (int i = 0; i < 10; i++) {
  63. //                std::cout << res[i] << " ";
  64. //            }
  65. //            std::cout << '\n';
  66. //        }
  67.  
  68.         return res;
  69.     }
  70. }
  71.  
  72.  
  73. int main(int argc, char *argv[]) {
  74.     auto memory_name = std::string(argv[1]);
  75.     memory_name = "/" + memory_name;
  76.     int fd = shm_open(memory_name.data(), O_RDWR, S_IRUSR | S_IWUSR);
  77.     auto f = (char *) mmap(nullptr, 64 * 1024 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  78.     if ((char *) (-1) == f) {
  79.         std::cout << errno << std::endl;
  80.         exit(1);
  81.     }
  82.  
  83.     auto status = reinterpret_cast<int *>(f);
  84.  
  85.     auto p = reinterpret_cast<uint32_t *>(f + 4);
  86.  
  87.     while (*status != -1) {
  88.         while (*status != 0) {
  89.         }
  90.         std::cout << *status << " new portion\n";
  91. //        sleep(5);
  92.         auto n = *p;
  93.         p++;
  94.         auto m = *p;
  95.         p++;
  96.         if (n > 500) {
  97.             flag = true;
  98.         }
  99.         std::cout << *status << " " << n << " " << m << "\n";
  100.  
  101.  
  102.         std::vector<uint32_t> matrix(m * m);
  103.         for (int i = 0; i < matrix.size(); i++, p++) {
  104.             matrix[i] = *p;
  105.         }
  106.  
  107.         std::cout << "from input get:\n";
  108.         for (int i = 0; i < 8; i++) {
  109.             std::cout << matrix[i] << " ";
  110.         }
  111.         std::cout << std::endl;
  112.         *status = 1;
  113.  
  114.         matrix = binpow(matrix, n, m);
  115.  
  116. //        for (int i = 0; i < m; i++) {
  117. //            for (int j = 0; j < m; j++) {
  118. //                std::cout << matrix[i * m + j] << " ";
  119. //            }
  120. //            std::cout << '\n';
  121. //        }
  122.  
  123.         std::cout << "writing....\n";
  124.         for (int i = 0; i < matrix.size(); i++, p++) {
  125.             if (flag && i < 10) std::cout << matrix[i] << " ";
  126.             uint32_t val = matrix[i];
  127.             *p = val;
  128.         }
  129.         std::cout << std::endl;
  130.  
  131. //        for (int i = 0; i < matrix.size() + 2; i++, old++){
  132. //            std::cout << *old << " ";
  133. //        }
  134. //        std::cout << std::endl;
  135.         *status = 2;
  136.     }
  137.  
  138.  
  139.     sleep(100000);
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement