42 lines
4.9 KiB
Markdown
42 lines
4.9 KiB
Markdown
# Банк 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.
|