Files
parallel-programming/common/bank_задач.md
T
2026-10-07 13:06:47 +05:00

4.9 KiB
Raw Blame History

Банк CPU-задач для вариантов

Все ядра уже реализованы в common/tasks.py. Здесь — смысловые описания: что считается результатом, почему задача CPU-bound и чем интересна при распараллеливании. Единый интерфейс каждой задачи:

split(total, parts) -> куски          — разбиение работы на части
kernel(кусок) -> частичный результат  — вычисление одной части
combine(части) -> итог                — сборка итога

Этот интерфейс намеренно совпадает с типовой схемой MapReduce — он один и тот же во всех лабораторных: сначала вы вызываете его последовательно, затем потоками, процессами и т. д.

№ Задача Результат Почему CPU-bound Особенности при распараллеливании
1 Умножение матриц (наивное, N×N) контрольная сумма произведения тройной цикл на чистом Python разбиение по строкам; большие данные при пересылке
2 Число π методом Монте-Карло приближение π миллионы случайных бросков идеально независимые части; суммирование счётчиков
3 Численное интегрирование (трапеции) значение интеграла миллионы вычислений f(x) разбиение отрезка; сумма частичных площадей
4 Подсчёт простых чисел ≤ M (перебор делителей) количество простых O(N·√N) на чистом Python разбиение диапазона; сумма счётчиков
5 Задача N ферзей (подсчёт расстановок) число решений комбинаторный перебор ветка = первый ферзь в колонке; сумма решений
6 Частотный анализ текста (подсчёт слов) словарь «слово → число» построчная обработка миллионов слов разбиение по строкам; слияние словарей
7 «Размытие» матрицы (box blur 3×3) контрольная сумма нового изображения 9 операций на пиксель на чистом Python разбиение по строкам с перекрытием (halo)
8 Хеширование строк (SHA-256) контрольная сумма дайджестов сотни тысяч хеширований независимые элементы; hashlib освобождает GIL
9 Сортировка слиянием больших массивов отсортированный массив сортировка миллионов элементов сортировка кусков + merge; дорогостоящая пересылка данных
10 Игра «Жизнь» (клеточный автомат) число живых клеток после T поколений обход поля на каждое поколение параллелятся поколения (шаги), обмен каймой строк

Примечания

  • Задачи 1–5, 7, 10 — «честно» последовательные на чистом Python: потоки их не ускоряют (GIL), процессы — ускоряют почти линейно.
  • Задача 8 — исключение: hashlib освобождает GIL на время хеширования одного блока, поэтому потоки дают реальное ускорение, если блоки крупные (≥ 256 КБ). На мелких блоках ускорения нет — GIL возвращается мгновенно. Используется в лабораторной 3 (сравнение 4 КБ против 1 МБ).
  • Задача 9 — демонстрация накладных расходов: пересылка данных процессам может съесть весь выигрыш от сортировки. Отличный материал для выводов в отчёте.
  • Задача 10 — знакомство с идеей обмена «каймой» (halo exchange), как в реальных сеточных методах и в MPI.