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