coloriot

HA_67

Aug 29th, 2025
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <thread>
  4. #include <future>
  5. #include <numeric>
  6.  
  7. // Простой класс для многопоточного reduce
  8. class SimpleReducer {
  9. public:
  10.     // Многопоточная версия reduce
  11.     template<typename Iterator, typename T, typename Func>
  12.     static T reduce(Iterator first, Iterator last, T init, Func func) {
  13.         size_t size = std::distance(first, last);
  14.        
  15.         // Если данных мало - используем обычный reduce
  16.         if (size < 1000) {
  17.             return std::reduce(first, last, init, func);
  18.         }
  19.        
  20.         // Количество потоков
  21.         size_t num_threads = std::thread::hardware_concurrency();
  22.         if (num_threads == 0) num_threads = 4; // fallback
  23.        
  24.         // Размер части для каждого потока
  25.         size_t chunk_size = size / num_threads;
  26.        
  27.         // Вектор для результатов от каждого потока
  28.         std::vector<std::future<T>> futures;
  29.        
  30.         // Запускаем потоки
  31.         Iterator current = first;
  32.         for (size_t i = 0; i < num_threads - 1; ++i) {
  33.             Iterator chunk_end = current + chunk_size;
  34.            
  35.             futures.push_back(std::async(std::launch::async, [=]() {
  36.                 return std::reduce(current, chunk_end, T{}, func);
  37.             }));
  38.            
  39.             current = chunk_end;
  40.         }
  41.        
  42.         // Последний поток обрабатывает оставшиеся элементы
  43.         futures.push_back(std::async(std::launch::async, [=]() {
  44.             return std::reduce(current, last, T{}, func);
  45.         }));
  46.        
  47.         // Собираем результаты
  48.         T result = init;
  49.         for (auto& future : futures) {
  50.             result = func(result, future.get());
  51.         }
  52.        
  53.         return result;
  54.     }
  55. };
  56.  
  57. int main() {
  58.     std::cout << "=== Reduce Test ===\n" << std::endl;
  59.    
  60.     // Создаем большой вектор
  61.     std::vector<int> numbers(5000000);
  62.     for (size_t i = 0; i < numbers.size(); ++i) {
  63.         numbers[i] = i % 100 + 1; // числа от 1 до 100
  64.     }
  65.    
  66.     std::cout << "Size: " << numbers.size() << " elements\n" << std::endl;
  67.    
  68.     // Тест 1: Сумма
  69.     std::cout << "Test 1: Sum" << std::endl;
  70.    
  71.     auto start = std::chrono::high_resolution_clock::now();
  72.     long long sum = SimpleReducer::reduce(numbers.begin(), numbers.end(), 0LL,
  73.                                          [](long long a, int b) { return a + b; });
  74.     auto end = std::chrono::high_resolution_clock::now();
  75.    
  76.     auto time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
  77.     std::cout << "Result: " << sum << std::endl;
  78.    
  79.     // Тест 2: Произведение
  80.     std::cout << "Test 2: Multiply" << std::endl;
  81.     std::vector<int> small = {1, 2, 3, 4, 5};
  82.    
  83.     int product = SimpleReducer::reduce(small.begin(), small.end(), 1,
  84.                                        [](int a, int b) { return a * b; });
  85.     std::cout << "1 * 2 * 3 * 4 * 5 = " << product << std::endl;
  86.    
  87.     // Тест 3: Максимум
  88.     std::cout << "\nTest 3: Max" << std::endl;
  89.     int max_val = SimpleReducer::reduce(numbers.begin(), numbers.end(), 0,
  90.                                        [](int a, int b) { return std::max(a, b); });
  91.     std::cout << "Max: " << max_val << std::endl;
  92.    
  93.     // Простая проверка корректности
  94.     std::cout << "\nCorrectness check:" << std::endl;
  95.     std::vector<int> test = {10, 20, 30};
  96.     int test_sum = SimpleReducer::reduce(test.begin(), test.end(), 0,
  97.                                         [](int a, int b) { return a + b; });
  98.     std::cout << "10 + 20 + 30 = " << test_sum << " (we expect 60)" << std::endl;
  99.    
  100.     return 0;
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment