elizarov


Блог Романа Елизарова


Previous Entry Share Next Entry
Искусство многопроцессорного программирования
elizarov

В 2005 году я начал преподавать в ИТМО курс параллельного и распределенного программирования. В начале мне порой даже было сложно объяснить важность этого курса. Популярность набирало программирование под мобильные платформы, и на вопрос "зачем мне это нужно — я буду программировать приложения под iPhone" я мог возразить только что-то типа "скоро и мобильные устройства станут многоядерными — уже есть отдельные образцы" и приводил графики, показывающие конец эры экспоненциального роста частоты и вычислительной мощности отдельного процессорного ядра. А сейчас двуядерные мобильные процессоры используются повсеместно и четырехъядерные на подходе, так что всё понятно и без графиков даже тем, кто не пишет код для сложных систем работающих под большой нагрузкой, как это мы делаем в Devexperts.

Подбор литературы для курса также был сложной задачей. Приходилось комбинировать информацию из различных книг и научных работ. А потом в 2008 году вдруг вышла в свет книга "The Art of Multiprocessor Programming" под авторством Мауриса Херлихи и Нира Шавита. Она содержала практически все темы, о которых я рассказывал в той части курса, которую я назвал "параллельное программирование" и которая посвящена системам с разделяемой памятью. Там очень хороший баланс теории и практики. С одной стороны, там подробно изложена теория синхронизации без ожидания, ключевое открытие в которой сделал сам Херлихи в своей работе от 1991 года под одноименным названием "Синхронизация без ожидания" и без знания которой невозможно понять ключевую роль атомарной операции СAS в x86 и SPARC или LL/SC в PowerPC, ARM и других архитектурах. С другой стороны, там дана хорошая подборка практических многопоточных структур данных и методов для их разработки как с блокировками так и без них (без ожидания).

Однако, основная цель, которую я преследую в своем курсе, это показать что многопроцессорное программирование это очень сложная тема даже для тех, кто глубоко разбирается в теории и практике этого предмета, а также детально понимает архитектуру современных процессоров. Истинное искусство многопроцессорного программирования заключается в том, чтобы его избежать. Знать и уметь использовать алгоритмы, которые позволят решить поставленную задачу на одном процессоре. Разбить задачу на независимые части так, чтобы каждую из них можно было бы решить на своем процессоре, без необходимости какой-либо коммуникации и синхронизации с ними, или сведя таковую к минимуму. Благо, в современном мире есть масса историй успеха подтверждающих это правило. Например, nginx завоевывает любовь в интернете во многом благодаря быстрому коду для обработки сотен соединений одновременно в одном потоке. Для масштабирования нужно просто запустить по экземпляру на каждом процессоре.

Конечно, не для каждой задачи можно применить такой подход. Даже в серверных системах, которые, казалось бы, отлично разбиваются на независимые друг от друга подзадачи обработки каждого запроса, часто возникает необходимость если и не иметь какое-то общее функционально-обоснованное состояние, то хотя бы кэшировать в памяти общие данные ради производительности. Ведь в мире, где память это новый диск, эффективное использование памяти остро стоит на повестке дня для того, кому важна максимальная производительность или минимальные расходы на вычислительную инфраструктуру. И вот тогда приходится знать и уметь применять теорию и практику многопроцессорного программирования. И если по практике есть ряд хороших книг (о которых я как-нибудь напишу) да и просто готовых библиотек кода, которые можно использовать и посмотреть как они устроены внутри, то доступных и полезных для программиста-практика книг по теории меньше. "Искусство многопроцессорного программирования" Херлихи и Шавита в этом смысле уникальный труд.

UPDATE: Я более подробно раскрыл одну из высказанных здесь мыслей в заметке "Искусство программирования без лишней синхронизации".


  • 1
На мой взгляд, книгу Херлихи и Шавита неплохо дополняет «Transactional Memory» под авторством Харриса и др. У Херлихи конечно тоже есть про TM, но мало — да и много нового появилось после 2008 года.

Обязательно посмотрю. Спасибо. Хотя и после 2010 уже нового не мало появилось - это вообще область активного исследования.

да, многопроцессорность имхо рулит не по деццки и могла рулить уже очень давно.. эх..
http://igormaznitsa.com/zxpoly/zxpoly.html

Забавно, но очень узкоспециализированно.

Вот эту статью читали? http://spectrum.ieee.org/computing/software/the-trouble-with-multicore

На мой взгляд познавательно. Подзаголовок статьи говорит сам за себя. :)

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

Судя по всему формат параллельного программирования будет еще видоизменяться, и возможно не один раз.

Спасибо, не знал про эту книгу. Херлихи, он же основоположник. Теоремы доказал.

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

  • 1
?

Log in

No account? Create an account