Блок задач

12. Многопоточность

Сложность 3

Задача «Алгоритм transform»

Постановка задачи

Реализовать обобщенную функцию ptransform, которая является многопоточной версией функции std::transform. Определение количества потоков выполнения является деталью реализации. Нижеприведенные сигнатуры функций ptransform фиксированы и не подлежат изменению.

//ptransform.hpp
template< class InputIt, class OutputIt, class UnaryOperation >
constexpr OutputIt ptransform( InputIt first1, InputIt last1, OutputIt d_first,
                              UnaryOperation unary_op );

template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
constexpr OutputIt ptransform( InputIt1 first1, InputIt1 last1, InputIt2 first2,
                              OutputIt d_first, BinaryOperation binary_op );

Параллельная версия алгоритма работает лучше, чем последовательная реализация, только если размер диапазона превышает определенный порог, который может варьироваться в зависимости от параметров компиляции, платформы или оборудования. Поэкспериментируйте с различными порогами и размерами диапазонов, чтобы увидеть, как изменяется время выполнения. И установите порог на минимальное количество элементов для выполнения многопоточной реализации.

Требования

  1. Сигнатуры функций ptransform фиксированы и не подлежат изменению.
  2. Названия header и source файлов следующие: ptransform.hpp.
  3. Написать unit test'ы для реализованных функций.
  4. Провести замеры времени выполнения функций для сравнения параллельной версии и последовательной.