Hard: Боже, храни писишников или История о том, как Гадкий Утенок стал Мерзким Селезнем
Автор: Владимир Рыбников (puree@ixbt.com)
Я знал человека, он строил дом. Он жил в маленькой деревне,
честно и тяжело трудился, но однажды нежданное наследство
дало ему возможность осуществить свою мечту. "Я построю
дом, который будет лучшим домом под солнцем!" - сказал он. И
он строил дом, оглядываясь на соседские хижины. Огромный дом из
лучшего дерева, с самым крепким тростником на крыше, с самыми
большими окнами, затянутыми слюдой, с самым большим и теплым
отхожим местом во дворе. Соседи в восхищении смотрели на него,
не понимая, что он построил всего лишь большую хижину.
Сергей Лукьяненко, "Близится утро".
Рождение Гадкого Утенка
Давайте для начала разберемся, чем был i8086. Так уж вышло, что все возможные ярлыки на меня уже повесили, так что бояться как бы и нечего :), поэтому я выдвину крамольную гипотезу: CPU (в том смысле, который многие привыкли вкладывать в это понятие сейчас) i8086 по-хорошему не был. И речь даже не о формальных признаках (по формальным признакам CPU можно назвать очень многие микросхемы), а прежде всего о позиционировании.
Сейчас CPU принято воспринимать как вычислитель - устройство, предназначенное для производства вычислений и операций с массивами данных, а не прочих "посторонних" задач. Если возвращаться к основам, то это может показаться неверным, однако на практике все складывается именно так. Конечно, можно заставить CPU заниматься и другими вещами, однако узкоспециализированные устройства (как правило, содержащие в себе собственные процессоры) со своими узкоспециализированными же задачами справляются на порядок быстрее. Так вот, i8086 - не был вычислителем. Это был процессор, единственным предназначением которого было поддержание функционирования того самого IBM PC XT, причем именно "всего целиком" т.е. единственным хоть сколько-нибудь умным устройством в нем, был он один. Создавался i8086 изначально по принципу "разумной достаточности", а если проще - то, как пела Алена Апина: "Я тебя слепила из того, что было…". Дешевая и немудрящая, простая в производстве микруха, которой как раз хватало на то, чтобы исполнять код MS-DOS и других несложных, нересурсоемких программ. Не секрет, что для IBM вся линейка PC XT была не более чем забавным экспериментом, причем в положительный его исход компания не очень-то верила изначально.
Однако Гадкий Утенок оказался на удивление жизнеспособным. Почему? А потому, что вдруг оказалось, что и не надо многим этой самой вычислительной мощи. И сложной Unix-like ОС тоже не надо. И даже Mac-овских "красивостей" (мы немного забегаем вперед) тоже не шибко хочется. А хочется набирать немудрящие текстики, лабать что-то для своих целей (пусть даже и на Basic), словом, нужна дешевая компьютеризованная игрушка для ума или же более интеллектуальная печатная машинка. Итак, первое слагаемое успеха i8086: оказалось, что на компьютере можно не только считать атомные бомбы, но и делать гораздо более приземленные (но не менее нужные) вещи. И делать их на компьютере действительно удобно. И сверхмощная система для этого совершенно не нужна. Запомните это слагаемое, мы к нему вернемся.
Меня опять забросают тухлыми помидорами, но второе слагаемое успеха IBM PC XT состояло в том, что он стал предтечей… сегодняшнего Palm! Не стоит воспринимать все буквально - никто не говорит, что люди обвешивались аккумуляторами, и носили его с собой. Однако если раньше для работы на компьютере нужно было идти в машинный зал и стоять в очереди на консоль мейнфрейма, то теперь некоторые вещи уже можно было делать, к примеру, дома. Это была первая ступенька в процессе отрыва компьютера от специализированного рабочего места. Но… самое смешное в этой ситуации заключается в том, что в ее контексте слово "процессор" выглядит как седло на корове. О какой "процессорной архитектуре" применительно к X86 может идти речь, когда победное шествие этой "архитектуры" началось не с процессора, а с одного-единственного законченного устройства?! Устройство получилось действительно превосходное. Процессор же в нем мог стоять любой архитектуры, какой угодно! Но успех PC XT определил успех программ и ОС MS-DOS, успех программ означал продолжение работы над ними и выход следующих версий, и рынок опомниться не успел, как увековечил сам толком не понимая что. Ох, и аукнется это ему впоследствии…
"… а сбоку - бантик"
Бешеный успех требовал хоть какого-то развития, и им стала PC AT и i80286. Задним умом все сильны, поэтому сейчас легко говорить о тенденциях, тогда же многие их отследить еще не смогли. Да и немудрено - всего второй (i80186 остался практически незамеченным) процессор новой и многим специалистам совершенно непонятной архитектуры. Однако на дворе 2002, и уже ясно, что основополагающие законы развития X86 были сформированы еще тогда: "процессор поколения N, далее - уродец с намеками на поколение N+1, и уже после - процессор поколения N+1". i80286 вызвал удивление еще большее чем i8086, потому что системы на его основе с одной стороны содержали в себе множество новшеств, с другой же - благодаря отсутствию тех новшеств, которые по идее обязаны были в них присутствовать, становилось немного непонятно, зачем же нужны те, которые есть :). Защищенный режим и адресация больших (по тогдашним меркам) объемов памяти, формально поддерживались, но у половины программеров их реализация вызывала один и тот же вопрос: "если оно такое навсегда, то зачем оно нам надо, а если не навсегда - то опять таки зачем?". Ответ последовал достаточно скоро: i80386.
Патриарх всех времен и народов
"А-а-а… Так вот какое оно должно было быть!" - воскликнули программеры. И оказались (на свое горе) правы. Именно такое оно и должно было быть. Почему на свое горе? Да потому, что такое оно и есть до сих пор :). i80386 стал классикой жанра, мало того - классикой, по живучести сходной разве что с тараканами. И последним процессором X86, в котором действительно что-то серьезно поменялось. Нет, даже не так. Не поменялось. Стало похоже на процессор. Дальше мы наблюдаем начало стагнации. Вы спросите - почему такой малый абзац про i386? А неинтересный он. Слишком уж правильный, меня же, как и всякого патологоанатома, больше интересуют отклонения :)
Кстати, об универсализме - именно i80386 и его не до конца испорченный клон i486 стали самыми массовыми в истории этой архитектуры процессорами, нашедшими применение в "чужой" сфере - не в PC, а в embedded системах. Что еще раз косвенно подтверждает их "правильность". Все более поздние достижения X86-строения для применения за пределами узкой ниши "писишек" были уже совершенно непригодны - сложные, дорогостоящие, не очень надежные, и… совершенно излишне производительные! Оказалось, что для того чтобы управлять сложнейшими устройствами в реальном времени, скорости 386/486 хватает "за глаза и за уши". И здесь мы видим еще одну примету стагнации: производительность процессоров семейства X86 при их применении в отрыве от ПК оказывается чрезмерной. И только их "родное" устройство находит способы эту мощь куда-то девать. Интересно - а куда? "Управлять" текстовым редактором сложнее, чем станком с ЧПУ? И что это за текстовый редактор такой? :)
Что-то уже становится понятно
486-е были восприняты на ура, и по праву. Их козырем была прежде всего производительность и интегрированный FPU (да, он был не у всех, но автор все же рискнет настоять на том, что именно 486DX стал основным "толкачом" всего поколения). И, как и всякое начало стагнации, 486 содержал парочку решений, которые позволяли малой кровью повысить скорость исполнения инструкций, т.е. тактически были вполне правильны, но стратегически они же сыграли роль раковой опухоли, которая впоследствии сожрала всю архитектуру целиком. Эти два решения - коэффициент умножения и кэш. Кэши, правда, появились еще в i80386, но там они были (как и надо!) опциональны т.е. были варианты CPU как с L1 так и без, а L2 на плату можно было не ставить. В 486 "опциональным" уже являлся только кэш второго уровня, но не зря я взял это слово в кавычки - производительность (основной козырь по отношению к 386) без L2 была такая, что лишать процессор этой подпорки категорически не рекомендовалось.
И ведь как это привлекательно - одним махом повысить скорость, сделав еще один (сравнительно большой) буфер для инструкций и кода, и взвинтив скорость работы ядра! Причем больше-то почти ничего делать и не надо! Так же привлекательно, как и убийственно. Потому что героин кэширования и асинхронности, будучи один раз употреблен, садит на иглу мгновенно и навсегда. Кто-то скажет - но ведь выросла же производительность! Выросла. Дальше я вам расскажу, чем обернулся этот рост…
Отдельных слов заслуживает интегрированный FPU. Понятно, что он не мог быть удачным и удобным с современной точки зрения - сколько лет прошло! Однако слово было сказано: FPU стал интегрированным. Хотите чтобы было быстро - используйте наш FPU! Он уже есть, ничего не нужно изобретать. Да, он несовершенен, да, есть Weitek, но у кого он есть? А наш - вот он, уже в чипе. На шару, как говорится. С этого момента начинается самый интересный (а технологически иногда просто блистательный с точки зрения изощренности решений!) этап: во всех следующих поколениях процессоров X86, все без исключения их разработчики и производители будут заняты двумя концептуальными вещами: борьба с последствиями введения коэффициента умножения и кэша, и борьба с классическим X87 FPU. Тем, насколько удачно эта борьба заканчивалась, определялась судьба процессора.
486, 236196… 114791256!!!
Самое интересное - это то, что в процессе добавления нашей любимой архитектуре подпорок, изящных, оригинальных, и действительно почти что гениальных технических решений рождалась масса! Здесь ведь как: нужно четко различать две вещи - оригинальность и то, на что она направлена. Предположим, у нас есть две шестеренки, которые зацеплены друг с другом. Шестеренки корявы, их отливали из чугуна, в глиняных формах, после чего обрабатывали зубилом и кувалдой. Но менять их нельзя. И вот гениальный инженер придумывает Сверхсовершенную Супермасляную Смазку, которая способна заставить их работать с КПД, похожим на что-то более-менее приличное. Величие инженерной мысли? Безусловно! Но ради чего…
После введения коэффициента умножения и размножения кэшей до двух, путей развития было два: либо отказываться от предыдущих решений, расширять шину, и придумывать другие методы ускорения работы (в том числе с памятью), либо придумывать нечто такое, что могло бы ускорить работу процессора на тех частотах работы ядра, когда кэш уже не мог обеспечить "плавности хода". Увеличение L2 (в те времена) приводило к громадному снижению процента выхода готовых процессоров, и, соответственно, к сверхвысокой цене (вспомним баснословные цены Pentium Pro). Но, естественно, отказываться никто ни от чего не стал. Шину расширили - и это был последний "здоровый" шаг со времен i80386. Фактически, с этого момента архитектура начала работать на самоуничтожение - каждый следующий рывок был судорожнее предыдущего, доставался большей кровью, и приносил меньше реальной пользы.
Вполне закономерно наступило время "костылей для подпорок". Ими стали механизмы предсказания ветвлений и спекулятивного исполнения инструкций, внутренняя RISC-архитектура, а позднее - механизмы предвыборки данных. И опять-таки нужно четко понимать: это именно "костыли для подпорок" то есть механизмы, призванные даже не лечить больного, чтобы он бегал быстрее, а усиливать эффект применения других допингов на той стадии, когда сами по себе они уже не оправдывали возложенных на них надежд.
Как еще один допинг, родились и начали множиться так называемые "дополнительные наборы команд". На самом деле это не дополнительные наборы т.к. дополнять к тому времени как они появились, было уже почти нечего. X87 FPU поднялся во весь рост, и со всей богатырской силушки дал своим же родителям по мозгам. Чем? Да всем! Производительностью. Малой приспособленностью для высокоточных вычислений. Капризностью внутренней архитектуры и ее непредсказуемостью (вспомним "ошибку Pentium" - ведь не студенты-первокурсники этот процессор делали, а значит, ее действительно было чрезвычайно трудно отловить на этапе проектирования!). Первый блин в лице MMX пытался быть именно "допнабором", за что его не шибко и любили. 3DNow! от AMD и SSE от Intel "допнаборами" называть уже сложно, потому что фактически тихой сапой производители начали вводить в X86 еще один FPU. Даже скорее не FPU, а специализированный расчетный блок, ориентированный не на "вычисления вообще", а на реальные, часто встречающиеся задачи. Класс задач и требуемый набор команд, конечно, каждый из разработчиков понимал по-разному, но в одном все сошлись: чем быстрее мы как можно больше вычислений выведем из классического X87 - тем лучше будет всем. Вершиной же стал SSE2, просто и откровенно "пославший X87 подальше" - теперь (при условии наличия поддержки SSE2) многие программеры могут вообще забыть FPU как страшный сон.
Самое Совершенное Устройство
Есть два способа сделать быстрый автомобиль. Первый способ, как это ни странно звучит - сделать быстрый автомобиль :). Второй способ сложнее, но увлекательнее - сделать так, чтобы автомобиль быстро ездил. Рецепт на самом деле прост. Не та аэродинамика? Значит, пускаем впереди аэродинамический щит. На неровной дороге при больших скоростях не выдерживает подвеска? Значит, пускаем впереди асфальтоукладчик и каток. Рулевое управление не справляется? Значит, надо повороты глаже делать! Знаете, с какой скоростью способен поехать "Жигуленок" с такой бандой впереди себя? Конечно, знаете - ибо на них мы и ездим. Кэши - чтоб не упираться в аэродинамику медленной памяти. Динамическое изменение порядка исполнения инструкций - тот же выравнивающий каток. Блок предсказания ветвлений и prefetch - "выравниватели поворотов". И понеслась… Главное, чтобы коробка передач коэффициент умножения побольше умела ставить :) Если взять условно и выразить в каких-то попугаях количество работы, выполняемой всеми блоками современных X86-процессоров, и посчитать, сколько этой работы приходится именно на выполнение кода - то (я уверен!) окажется, что большую часть времени эти процессоры работают не на нас с вами, а на себя.
Я не хочу углубленно обсуждать различие конструкций катка и аэродинамического щита у последних творений ведущих конкурентов. Материал не об этом. Замечу только, что imho (imho!) с точки зрения выбранной схемы развития Pentium 4 смотрится гораздо более… логичным что ли? Он действительно насколько это возможно асинхронен, снабжен великанским по нынешним меркам для десктопного процессора кэшем второго уровня с 256-битной шиной, работающим на частоте ядра, и даже его динамический механизм "сброса паров" при перегреве укладывается в ту же схему: "выжать максимум возможного, пока это возможно". Значит ли вышесказанное, что я его за это хвалю? Нет, я не хвалю. Я лишь констатирую, что он полностью укладывается в основную схему развития X86 как архитектуры. И поэтому обладает всеми ее достоинствами и недостатками одновременно, причем в большей степени, чем какой-либо другой процессор. Он является закономерным и предсказуемым венцом развития. А "развития чего?" и "развития куда?" - это уже другие вопросы. Равно как и "развития зачем?".
Причем что вдвойне интересно - Pentium 4 повторил "фишку" i8086! Это не универсальный процессор, и не универсальный вычислитель. Свой собственный родной X86-код он исполняет то быстро, то медленно, в зависимости от структуры программы, по производительности злосчастного FPU отстает от основных конкурентов… Зато он очень быстр при массированных операциях с большими линейными объемами данных и в тех случаях, когда можно задействовать SSE2. Специализированный процессор для наиболее хитовых пользовательских приложений - вот окончательный его диагноз. Только специализация немного изменилась - если во времена Прародителя актуален был Basic и текстовый редактор, то теперь потенциального пользователя больше привлекают мультимедиа и игрушки. Все вернулось на круги своя, на новых частотах и с новыми силами. Архитектура X86 глядит в лицо сама себе, обнаруживая на физиономии следы долгого, скажем так, "прогресса" :), и мучительно пытается понять, где же ее носило все это время…
Неоптимистический эпилог или "И что же будет?"
А ничего хорошего. По крайней мере, для тех, кто вовремя не просечет тему, и не отвалит загодя от "поезда в огне" под названием "архитектура X86". Ее жрецы сейчас пожинают те же плоды, что когда-то пожинали патриции, создавшие идеологию и мировоззрение Великого Рима, и с ним же благополучно похороненные. Боже, храни писишников… Воспитанники Гадкого Утенка, заучившие с детства священные мантры, они повторяют их с истовым рвением, давно уже превзошедшим самые смелые мечты своего воспитателя. И не дай Бог кому-то отойти от классического канона! Что значит "не будет запускаться Digger"?! Кто посмел?!! Вы обещали нам сквозную совместимость сверху вниз?! Так разбейтесь в лепешку, но выполняйте обещания! Поддерживайте CGA и EGA, поддерживайте DOS-приложения и 16-битовый код, обеспечьте мне работу моего любимого IDE-контроллера на ISA-шном Sound Blaster под Windows XP! Используйте x87 FPU! Урод? Да, урод, но он же у меня есть! У меня их в процессоре аж три штуки, а вы, гады, толкуете мне про какие-то SSE или 3DNow! Феномен X86 возродил благополучно усопший в районе средних веков вид коллективного помешательства - консерваторы с пылом революционеров в кубе. Активный, агрессивный, зубастый, и вооруженный до этих самых зубов консерватизм.
Но это все ненадолго. А сейчас уже с уверенностью можно сказать, что очень ненадолго. Какие там внуки - даже дети наши будут работать на совершенно других компьютерах. Причем вовсе не обязательно в них будут стоят "пламенные моторы" на 20 гигагерц, двухтерабайтные винчестеры, гигабайтные видеокарты с филрейтом в пару гигатекселей в секунду и устройства охлаждения на жидком азоте. Заканчивается эпоха "саманных дворцов". Дворцы должны строить Архитекторы с большой буквы, а не десять тысяч ремесленников под руководством десять тысяч первого. Играть нужно на устройстве, предназначенном для игр. Работать - на устройстве, предназначенном для работы. Сервер на том же процессоре что у меня в десктопе - это просто большой десктоп, а не сервер. Даже если у него самый большой и теплый L2 во дворе :). А картофель-фри из фритюрницы, совмещенной со стиральной машиной, будет отдавать стиральным порошком все равно, какие только хитроумные фильтры не ставь. И лично мне этот привкус во рту уже начинает потихоньку надоедать. Думаю, не одному только мне.
P.S. Некоторым может показаться, что материал злой и деструктивный. Это не так, точнее, не совсем так. Лучшей иллюстрацией моего отношения к X86 является то, что именно на компьютере с этой архитектурой, я все это и пишу. "…Ежики плакали, кололись, но продолжали есть кактусы" :) Вклад X86 в популяризацию компьютера как устройства - огромен, и с этим никто не спорит. Однако нельзя быть актуальной пожизненно. X86 "отстрелялась", и сегодня ей уже пора на покой. Что же касается злости… Львиная ее доля приходится даже не на архитектуру как таковую, а на тех, кто снова и снова выпускает на круг старую клячу, некогда действительно бывшую молодым жеребцом.
Опубликовано 15 февраля 2002 г.