Оптимизация параллельных программ: от простых очередей до Cilk-планирования

Stanford Online 13 тыс. 1 ч 17 мин 2 мин 16.09.2024
Главное

Оптимизация производительности: распределение задач и планирование 5:29

Для достижения высокой производительности программ важно эффективно распределять вычислительную нагрузку между доступными ресурсами. Лектор из Стэнфордского университета объясняет, что наиболее действенный подход — это использование простых стратегий с последующим анализом данных, а не преждевременное внедрение сложных схем. Оптимизация должна базироваться на конкретных измерениях производительности, так как часто «интуитивно правильные» сложные решения работают медленнее, чем простые методы.

⚖️ Статическое распределение задач 8:14

Статическое распределение предполагает распределение работы между потоками до начала выполнения или на длительные периоды. Это минимизирует накладные расходы на коммуникацию и синхронизацию, так как потоки знают свою зону ответственности заранее.

⚡ Динамическое распределение и очереди задач 17:02

Когда время выполнения задач сильно различается и непредсказуемо, лучше использовать динамическое назначение. В этом случае потоки берут работу из общей очереди по мере освобождения.

🧩 Иерархическое программирование с Cilk 41:57

Для алгоритмов «разделяй и властвуй» (например, быстрой сортировки) существует удобная абстракция Cilk. Она позволяет программисту сосредоточиться на выявлении независимых кусков работы, делегируя планирование системе.

🛠️ Реализация Join-планирования

При реализации sync система должна отслеживать завершение всех асинхронных задач, которые могли быть распределены между разными потоками. Используется «жадное планирование» (greedy join scheduling), где каждый поток пытается забрать работу, если она есть. Если задача из блока была украдена, система ведет учет ссылок, чтобы после завершения всех зависимых подзадач основной поток мог продолжить выполнение.

💬 Цитаты

«Без вопроса, я хочу, чтобы вы использовали самый простой подход, который заставит программу работать.»

«Статическое распределение — это не значит, что оно известно во время компиляции.»

👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Work Stealing
Техника балансировки нагрузки, при которой свободные потоки забирают задачи из очередей занятых потоков.
SPMD
Single Program, Multiple Data: модель, где все потоки выполняют один и тот же код, но на разных данных.
Static Assignment
Назначение задач потокам до выполнения, минимизирующее накладные расходы.
Granularity
Размер порции работы (задачи) при параллельном выполнении.
📊 Цифры
⚖️ Другая сторона
Технологии и IT Stanford CS149 Performance Optimization Work Scheduling Cilk Work Stealing