Вчера моя девушка купила себе Sims 3. Ну вы знаете… Маленькие человечки, которые постоянно требуют спать и есть. Эдакие тамагочи, которым хватает вычислительной мощности чтобы обсчитывать нравятся ли им их соседи, босс и прическа того волосатого парня, который косится на них в течении всей вечеринки. Полторы тысячи за лицензионную копию. И на обороте бокса вы можете прочитать:
Системные требования CPU: (XP) процессор P4 с частотой 2.0 ГГц или аналогичный: (Vista) процессор с частотой 2.4 ГГц или аналогичный. RAM: (XP) 1 Гб оперативной памяти: (Vista) 1.5 Гб оперативной памяти.
Кто-нибудь задумывался над смыслом таких требований? Почему Vista требует на 20% более мощный процессор и на 50% больше оперативной памяти?
Существует шуточный закон “Что Энди дал, то Билл забрал” (“Andy giveth, and Bill taketh away”). Это означает, что прирост производительности даваемый каждым новым чипом компании Intel (Andy Grove) уравновешивается performance penalty нового продукта Microsoft (Bill Gates).
Конечно, это шутка, но в кажой шутке есть доля правды1. Дайте программисту в два раза более мощный процессор и он найдет причину делать в два раза больше работы или не будет чувствовать особой вины в том, чтобы делать работу в два раза менее эффективно. Зачем тратить время на оптимизацию ПО, если можно просто купить более мощный процессор? Это называется вертикальным масштабированием. И иногда, это чертовски хороший подход, потому что время программиста стоит дороже, чем время процессорное. Возьмие для примера Amazon’овский Elastic Cloud. 1 час работы на восьми EC2 Unit (каждый unit это Opteron/Xeon c частотой примерно 2.5 ГГц) стоит… 80 центов2. Это примерно 18500 рублей в месяц. За такие деньги квалифицированного программиста вы себе не наймете. Но вертикальное масштабирование не панацея. И рано или поздно оно перестает работать. Учитывая, что тот экспоненциальный рост частоты процессоров (читай производительности) о котором говорят на каждом углу перестал быть экспоненциальным еще в 2003 году, оно пересает работать скорее рано чем поздно. Да да, у нас появилось много ядер. Новая линейка чипов Intel для настольных систем содержит 4 физических/8 логических процессоров (кто бы мог подумать, HyperThreading по прежнему жив). Но значит ли это что приложения стали выполнятся в 4 раза быстрее? Нет.
Тому есть несколько причин. Во-первых, есть задачи, которые не параллелятся в принципе. Разбор XML хороший пример. Это чистого вида sequential задача. Во-вторых, есть так называемые точки сериализации, о которых я писал раньше3. Из-за них процессоры должны тратить некоторое время на обеспечение когерентности кеша, чтобы иметь корректное отображение оперативной памяти в кешах. Эти точки сериализации есть всегда (многие процессы, такие как выделения памяти, требуют координации на уровне операционной системы). Безусловно, то что я сказал, это некоторое упрощение реальной ситуации. Но смысл в том, что 2 * 2 ГГц не равно 4 ГГц.
Наша проблема в том, что долгое время мы ставили знак равенства между частотой и производительностью. Что может быть проще, чем просто дождаться “следующего шага” Intel? Своего рода free lunch, о котором писал Herb Sutter еще в 2005 году4.
Справедливости ради хочу сказать, что я не виню Microsoft. Наоборот Windows 7, по моему мнению, делает успехи, и не только в плане производительности. Но мы должны отказаться от той мысли, что инженеры Intel и AMD смогут легко увеличить производительность наших приложений путем наращивания частоты. Теперь эти самые инженеры делают все для того, чтобы экспоненциальная гонка не останавливалась, даже если для этого придется заставить программистов сменить парадигмы программирования.
Что мы и наблюдаем. Функциональные языки набирают обороты. Microsoft Research занимается разработкой Maestro. Java получает fork/join framework и обзаводится реализацией software transactional memory. И это только верхушка айсберга.
По словам того же Herb’а Sutter’а, существующие реалии развития микропроцессоров должны совершить революцию во взглядах на то, как мы должны писать программы. Последнюю такую революцию, по его мнению, совершило объектно-ориентированное программирование. Я более спокоен во взглядах на то, какую роль в нашей жизни играют параллельные вычисления. Но в чем-то Herb прав. Если хотите быть хорошим специалистом, самое время начать получать опыт работы с конкурентыми задачами.
Пока же Intel выжимает из своих процессоров все для того чтобы повысить sequential execution speed. И пока это так, я могу смело запустить Sims 3, продать старую раковину, купить новые обои в гостиную и пригласить кого-нибудь на сегодняшнюю вечеринку. Чертовски забавная игра, все таки.