Перейти к содержанию

ДЗ Лабораторная работа №4 "Знакомство с параллелизацией"#

Warning

За задание можно получить до 5 баллов, соблюдая следующие условия:
- Написано на C++ ( + 2 балла)
- Задание зачтено ( +3 балла)

В отчете должно быть указано следующие:
1. Титульный лист, где указаны ФИО преподавателя, номер задания, номер варианта
2. Формулировка задания
3. Ссылка на github-репозиторий с работающим кодом
4. В конце работы приводятся реальные замеры на вашем ЭВМ в виде таблицы 1 и графика
5. Сопоставить график из работа 3 и график из работы 4
6. Рассчитать коэффициент ускорения. Результаты внести в таблицу 2. (см. Коэффициент ускорения для многопоточной быстрой сортировки)
7. Сделать выводы относительно ускорения. Праивльно ли вами был подобран N?
7. Для реализации С++ (реже python) если будет использован mutex, дать описание что это такое и как он работает. Также вы можете реализовать используя Omp (OpenMP), но в таком случае от вас также требуется описание работы. В своей параллельной схеме я не вижу необходимости в использовании вышеуказанных средств, но вдруг кто-то увидит.

Пример таблицы 1 (2,4, 8 потоки, БС - быстрая сортировка, БС_П - быстрая сортировка параллельная)

Размер массива БС (сек) БС_П 2 потока (сек) БС_П 4 потока (сек) БС_П 8 потока (сек)
100 ххх ххх ххх ххх
1000 ххх ххх ххх ххх
10000 ххх ххх ххх ххх
20000 ххх ххх ххх ххх
30000 ххх ххх ххх ххх
40000 ххх ххх ххх ххх
50000 ххх ххх ххх ххх

Паралельная схема#

  1. Функция quicksort реализуется аналогично практике 5, за исключением ввода нового параметра num_threads - количество потоков
  2. Фиксируется N - длина массива, если массив большой, то происходит Параллельная обработка подмассивов если достаточно потоков
  3. Если подмассивы достаточно маленькие, сортируем их с помощью стандартной сортировки

Коэффициент ускорения для многопоточной быстрой сортировки#

Для расчёта коэффициента ускорения используем следующую формулу:

Формула для коэффициента ускорения (Speedup):#

\text{Speedup} = \frac{\text{Время для обычной сортировки}}{\text{Время для многозадачной сортировки}}

Шаги для расчёта коэффициента ускорения:#

  1. Для каждого теста (для каждого размера массива):
  2. Найдите время выполнения обычной сортировки (Normal quicksort time).
  3. Найдите время выполнения многозадачной сортировки для каждого количества потоков (Multithreaded quicksort time for N threads).

  4. Расчитайте коэффициент ускорения для каждого количества потоков:

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

Пример расчёта:#

Для массива из 100 элементов:#

  • Время для обычной сортировки: 1.46e-05 секунд.
  • Время для многозадачной сортировки с 2 потоками: 7.1e-06 секунд.
  • Время для многозадачной сортировки с 4 потоками: 5.4e-06 секунд.
  • Время для многозадачной сортировки с 8 потоками: 7.4e-06 секунд.

Коэффициенты ускорения:#

  • Для 2 потоков:
  • Для 4 потоков:
  • Для 8 потоков:

Таблица 2. Коэффициенты ускорения для всех тестов:#

Размер массива Время обычной сортировки (с) Время сортировки с 2 потоками (с) Время сортировки с 4 потоками (с) Время сортировки с 8 потоками (с) Speedup (2 потока) Speedup (4 потока) Speedup (8 потока)
100 1.46e-05 7.1e-06 5.4e-06 7.4e-06 2.06 2.70 1.97
1000 0.0001802 5.37e-05 6.45e-05 5.23e-05 3.35 2.79 3.44
10000 0.0032846 0.0009314 0.0008785 0.0008313 3.53 3.74 3.95
20000 0.0053028 0.0018631 0.0018122 0.0018589 2.84 2.92 2.85
30000 0.0077676 0.0052955 0.0024391 0.0023903 1.47 3.18 3.24
40000 0.0104027 0.0031628 0.0027341 0.0029274 3.29 3.81 3.55
50000 0.0132361 0.0035579 0.0034121 0.003922 3.73 3.88 3.37

Коэффициент ускорения позволяет оценить, насколько быстрее работает многозадачная версия алгоритма по сравнению с обычной версией. Как видно из таблицы, ускорение значительно варьируется в зависимости от размера массива и числа потоков. Например, для массива из 1000 элементов скорость увеличивается с 3.35 для 2 потоков до 3.44 для 8 потоков, но для более крупных массивов ускорение может снижаться из-за накладных расходов на создание и управление потоками.

Примечание : данная таблица посчитана для C++. на Python результаты могут быть иными. Подозреваю, что Speedup у вас будет в таком случае напротив меньше 1.