4.9 KiB
4.9 KiB
Банк 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.