Параллельные вычисления и многопоточность
💻 Информатика · 11 класс
Что такое параллельные вычисления
Параллельные вычисления — это способ организации программы, при котором несколько её частей выполняются одновременно на разных вычислительных устройствах или ядрах процессора. Цель — сократить общее время работы за счёт разделения задачи на части, которые считаются независимо.
Связанное понятие — многопоточность: программа делится на несколько потоков выполнения, которые могут работать параллельно. Современные процессоры имеют несколько ядер, поэтому потоки действительно выполняются в одно и то же время.
Когда задача распараллеливается
Не любую задачу можно ускорить параллельностью. Хорошо распараллеливаются задачи, которые делятся на независимые части: обработка пикселей изображения, суммирование больших массивов, перебор вариантов. Плохо — задачи, где каждый шаг зависит от результата предыдущего.
| Задача | Распараллеливается | Причина |
|---|---|---|
| Сумма массива по частям | да | части независимы |
| Обработка кадров видео | да | кадры независимы |
| Вычисление ряда по рекурренте | плохо | шаг зависит от прошлого |
Закон ускорения
Ускорение ограничено той частью программы, которую нельзя распараллелить. Если доля последовательной части велика, даже множество ядер не даст большого выигрыша. Это формулирует закон Амдала: общее ускорение зависит и от числа ядер, и от доли непараллельного кода.
Разбор примера
Нужно сложить массив из 8 чисел на 4 ядрах:
Ядро 1: a[0]+a[1]
Ядро 2: a[2]+a[3]
Ядро 3: a[4]+a[5]
Ядро 4: a[6]+a[7]
Затем складываем 4 частичные суммы.
Вместо 7 последовательных сложений получаем 2 этапа: четыре параллельных сложения, затем объединение. Время заметно сокращается, хотя общее число операций то же.
Процесс и поток
Важно различать два понятия. Процесс — это запущенная программа со своей отдельной областью памяти. Поток — часть процесса, которая выполняется независимо, но делит память с другими потоками того же процесса. Поэтому потоки одного процесса легко обмениваются данными, но именно общая память порождает опасность конфликтов, когда два потока одновременно меняют одну переменную.
Согласование потоков
Когда несколько потоков работают с общими данными, нужна синхронизация — правила, не позволяющие потокам мешать друг другу. Если два потока одновременно прибавляют к счётчику, без согласования часть прибавлений может потеряться. Поэтому участок кода, работающий с общим ресурсом, делают так, чтобы в каждый момент в нём находился только один поток. Чрезмерная синхронизация, однако, замедляет программу, поэтому ищут разумный баланс.
Частые ошибки. Считают, что число ядер всегда даёт пропорциональное ускорение — мешает последовательная часть и затраты на согласование. Распараллеливают зависимые шаги и получают неверный результат. Забывают про конфликты потоков при доступе к общим данным.
Кратко о главном
- Параллельные вычисления выполняют части программы одновременно.
- Многопоточность делит программу на потоки, работающие параллельно.
- Распараллеливаются только независимые части задачи.
- Ускорение ограничено долей последовательного кода (закон Амдала).
- При работе с общими данными возможны конфликты потоков.