ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

в крошечную керамическую пластинку, свободно


Миллиарды битовых ячеек, упакованных в крошечную керамическую пластинку, свободно умещающуюся на ладони... Сегодня, когда счет оперативной памяти пошел на сотни мегабайт, мы – программисты – наконец-то избавились от "удовольствия" оптимизации своих программ по скорости и размеру одновременно. Пусть будет нужен хоть гигабайт – система выделит его за счет жесткого диска!
Правда, производительность подсистемы памяти все еще оставляет желать лучшего. Причем, современная ситуация даже хуже, чем была десять-пятнадцать лет тому назад. Если персональные компьютеры конца восьмидесятых – начала девяностых оснащались микропроцессорами с тактовой частотой порядка 10MHz и оперативной памятью со временем доступа в ~200 нс., типичная конфигурация ПК ближайшего будущего: 1.000 – 2.000 MHz и 20 ns. Нетрудно подсчитать, что соотношение производительности памяти и процессора уменьшилось более чем в тысячу раз!
Несмотря на стремительный рост пропускной способности оперативной памяти, наблюдающийся в последние годы, разрыв "CPU vs Memory" растет с чудовищной быстротой. Забавно, но с этой ситуаций мы сталкиваемся отнюдь не впервые: приблизительно сорок-пятьдесят лет тому назад, – в эпоху "больших" машин с быстродействующими (по тем временам!) процессорами и жутко медленной барабанной (а позже и ферритовой) памятью, – соотношение быстродействие памяти и процессора было приблизительно тем же самым.
Интересно, как же конструкторы ЭВМ выходили из этой ситуации? Откроем, например, "Структуры ЭВМ и их математическое обеспечение" Л. Н. Королева: "Для того чтобы достичь необходимого баланса между высокой скоростью выполнения арифметических и логических действий в центральном процессоре и ограниченным быстродействием блоков оперативного ферритового запоминающего устройства (время цикла работы каждого блока - 2 мксек.), были предприняты следующие меры.
Оперативное запоминающее устройство состоит из восьми блоков, допускающих одновременную выборку информации (командных слов и операндов), что резко повышает эффективное быстродействие системы памяти.
Подряд идущие физические адреса памяти относятся к разным блокам, и если оказалось, например, так, что последовательно выбираемые операнды имеют последовательно возрастающие (убывающие) адреса, то они могут выбираться со средней скоростью, равной 2 мксек/8=0,25 мксек...
Второй структурной особенностью организации обращений к оперативному запоминающему устройству является метод буферизации, или метод накопления очереди заказов к системе памяти. В машине БЭСМ-6 существуют группы регистров, на которых хранятся запросы (адреса), называемые буферами адресов слов и команд. Разумеется, что эти буфера могут работать эффективно только в том случае, если структура машины позволяет просматривать команды "вперед", т. е. загодя готовить запросы. Устройство управления БЭСМ-6 позволяет это делать. Буфера адресов позволяют в конечном итоге сгладить неравномерность поступления запросов к памяти и тем самым повысить эффективность ее использования.
Третьей структурной особенностью БЭСМ-6 является метод использования сверхоперативной, не адресуемой из программы памяти небольшого объема, цель которого – автоматическая экономия обращений к основному оперативному запоминающему устройству. Эта сверхоперативная память управляется таким образом, что часто используемые операнды и небольшие внутренние командные циклы оказываются на быстрых регистрах и готовы к немедленному использованию в арифметическом устройстве или в системе управления машиной. Быстрые регистры в ряде случаев позволяют экономить до 60% всех обращений к памяти и уменьшают тем самым временные затраты на ожидание чисел и команд из основной памяти.
Следует еще раз подчеркнуть, что об использовании быстрых регистров заботится аппаратура самой машины и при составлении программ об экономии обращений к памяти думать нет необходимости. [Выделение мое – КК]
Эти структурные особенности БЭСМ-6 получили название водопроводного [ныне "конвейерного" – КК] принципа построения структуры машины. В самом деле, если подсчитать время от начала выполнения команды до его окончания, то для каждой команды оно будет очень велико, однако глубокий параллелизм выполнения, просмотр вперед, наличие буфера адресов, быстрых регистров приводят к тому, что "поток" команд и темп обработки информации очень высок.


Аналогия с водопроводом состоит в том, что если проследить время, за которое частица воды проходит по некоторому участку водопровода, то оно будет большим, хотя скорость на выходе потока может быть очень велика.
Четвертой структурной особенностью БЭСМ-6, имеющей очень важное значение для построения операционных систем и работы машины в мультипрограммном режиме, является принятый аппаратный способ преобразования математических, или виртуальных адресов в физические адреса машины. В машине БЭСМ-6 четко выдержано деление на физическую и математическую память, принята постраничная организация, однако способ отображения, заложенный в аппаратуру, значительно отличается от того, который был применен в машине…".
Трудно отделаться от впечатления, что перед тобой лежит не перечень ключевых концепций архитектуры P6 (Pentium Pro, Pentium-II, Pentium-III…), а описание "морально устаревшей" электронно-вычислительной машины, ценящейся сегодня разве что за драг. мет. Ан нет! Еще может старушка нас чему-то научить! Мы гордимся современной аппаратурой и пренебрежительно относимся к достижениям двадцати-тридцати летней давности, между тем это ослиная гордость. Чтобы там ни говорила реклама, невозможно не признать, что за последнее время ничего принципиально нового не придумано. Эксплуатируется сравнительно небольшое количество весьма древних идей и, если что и совершенствуется, – так это проектные нормы. БЭСМ-6 занимала целый шкаф, а процессор Pentium свободно умещается на ладони. Но в нем нет ничего такого, что в том или ином виде ни присутствовало бы в "динозаврах" первых поколений.
Обратите внимание на выделенный жирным шрифтом абзац. Идеология сверхоперативной
(или "кэш", как принято сейчас говорить) памяти изначально позиционирует ее как прозрачную и не видимую для программиста. Так утверждали и конструкторы БЭСМ, так утверждают и создатели процессоров Pentium/Krypton. Между тем, это утверждение неверно. Эффективная работа с памятью всех иерархий без учета ее физических, конструктивных и архитектурных особенностей невозможна! Как минимум программист должен позаботиться о том, чтобы интенсивно используемые данные целиком уместились в кэш, а для достижения наивысшей производительности следует тщательно согласовать запросы к памяти с "характером" всех ее подсистем.
Проблемам такого согласования, собственно, и посвящена эта книга…

Содержание раздела