По следам Meltdown. Часть первая: от последовательности к конвейеру

По следам Meltdown. Часть первая: от последовательности к конвейеру

https://t.me/cooladmin
Disclaimer: Всё ложь и искажение фактов, автор дилетант и вообще не шарит.

В январе 2018 года стали известны детали уязвимости Meltdown шум не утих до сих пор. Окончательного решения всё ещё нет.

Первая часть

Первые вычислительные машины были огромными, дорогими, очень горячими, и не очень надёжными. 

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

Появление интегральных микросхем, а затем и однокристальных микропроцессоров многое поменяло.

Что скрывается в современном процессоре? Как росла его производительность без изменения частоты от поколения к поколению? Что означают и чем отличаются внеочередное или спекулятивное выполнение? Продаёт ли процессор картошку по бросовой цене или чем он там спекулирует?

Но обо всём по порядку. 

Базовые операции x86

Если упростить всё, что делает вычислительная машина, то останутся четыре простые стадии:

  1. F - Fetch - Получение инструкции из памяти
  2. D - Decode - Декодирование инструкции и разложение её на микроинстукции. Чтение операндов из регистров
  3. E - Execute - Вычисление или исполнение микроинструкции или вычисление адреса для работы с памятью
  4. - Write - Запись результата в регистр назначения или обновление счётчика. (в некоторых источниках эту операцию разделяют на две: отдельно запись памяти, отдельно запись регистра)
Хозяйке на заметку: Граница ответственности и влияния между программистом и производителем CPU проходит по тонкой линии, называемой Набор инструкций. Всё, что видит программист — какие и как эти инструкции исполняются. Всё, что делает производитель CPU — ускоряет скорость их выполнения или расширяет их набор.

Доконвейерная эпоха

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

Чтобы система знала о моменте, когда один цикл закончился, и пора начинать второй — снаружи системы\процессора находился специальный генератор переменного сигнала. Именно количество выполняемых циклов в секунду и определяло производительность. Чем больше — тем лучше.

Какие-то операции могут быть быстрыми, какие-то занимают больше времени, главное, чтобы все они проходили за один цикл — сигнал тактового генератора. 

R-D-E-W -> R-D-E-W. Два цикла выполнения двух инструкций по очереди

Рост производительности, который мы наблюдали в ранней эпохе вычислительной техники, был основан на двух подходах:

  1. С точки зрения Программного обеспечения — уменьшение размера кода и оптимизация алгоритмов
  2. С точки зрения Аппаратного обеспечения — уменьшение времени такта, увеличение частоты работы процессора (машины), и ускорение каждой базовой операции, чтобы уменьшить время такта

Такая модель просуществовала достаточно долго. Она стала стандартом работы большинства систем и заложила фундамент для всех будущих шагов развития и роста производительности вычислительной техники.

Появление Конвейера \ Pipeline 

Следующим важным шагом развития вычислительных устройств стал переход к конвейерному (не производству:) принципу работы — весь процесс выполнения разделили на этапы работы. Каждая операция выполняется за один такт.

R-D-E-W -> R-D-E-W. Два цикла выполнения двух инструкций с перекрытием в конвейере

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

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

Хозяйке на заметку: Количество этапов конвейера современного процессора колеблется от 18 до 22 - это оптимальный размер с учётом современных нагрузок и возможной плотности компонент внутри ядра.
В процессоре Pentium 4 на ядрах Prescott и Cedar Mill длинна конвейера достигла 31 ступени. Это позволило нарастить частоту (что во времена гонок вооружений за счёт частоты было важно).

Максимальное количество параллельно обрабатываемых инструкций находящихся на разных этапах конвейера называется шириной машины — этот параметр так же меняется со временем и постепенно возрастает. Современные CPU способны поддерживать обработку 5-6 инструкций внутри конвейера.

Ограничения конвейера:

  • Конвейер не может выполнять в параллельно инструкции, между которыми есть зависимости
  • Конвейер сбрасывает своё состояние, если в него поступает инструкция ветвления — он вынужден выполнить сначала её
  • Если все инструкции, оказавшиеся в конвейере, "долгие" — они займут всю ширину машины

Эти и другие события приводят к простою конвейера. Возникает пауза в обработке инструкций, понижающая эффективность CPU.

Рост производительности во времена первого появления конвейеров, в основном, был связан с:

  • Уменьшением размера такта, увеличением количества стадий
  • Появлением нескольких уровней кешей и оптимизацией доступа к памяти
  • Аппаратныс ускорением обработки некоторых этапов конвейера, для сокращения размера такта

Важно понять, что конвейер оптимизирует пропускную способность процессора, но не время в выполнения конкретной инструкции.

Конец первой части

Дальше поговорим о:

  • Суперскалярности
  • Внеочередном выполнении
  • Спекулятивности

До скорого (я надеюсь=)

Материал подготовлен специально для канала (угадайте какого) Подписывайтесь. =)
Все посты и переводы можно найти тут http://telegra.ph/Soderzhanie-05-04 Пишите cooladm1n@ya.ru

Report Page