Chapter_15 (1110567), страница 3
Текст из файла (страница 3)
Как, например, наконвейере автомобильного завода одновременно находятся несколько машин в разной стадии сборки,так и на конвейере центрального процессора находятся несколько команд в разной стадии выполнения. Отметим, что теперь в центральном процессоре уже нет привычного для прежних ЭВМ регистра команд, на котором располагается текущая выполняемая команда. Вместо этого поток выполняемых команд располагается в специальном буфере команд.Отметим хорошее свойство любого конвейера: хотя выполнение каждой команды, как в нашемпримере, занимает шесть шагов, однако на каждом шаге с конвейера "сходит" полностью выполненная команда.
Таким образом, использование такого рода конвейера позволяет, в принципе, вшесть раз повысить скорость выполнения программы.Вот теперь, после введения в архитектуру ЭВМ конвейера, мы, наконец, достигли соответствия скорости работы центрального процессора и памяти. Действительно, предположим для простоты,что каждое из шести устройств на конвейере выполняет свой этап обработки команды за 1нс, тогдакаждая команда выполняется на конвейере за 6нс, и за это время ЦП успевает произвести все необходимые обмены и командами и данными с памятью (чаще всего из кэша).
В то же время, как мы ужеотмечали, скорость выполнения потока команд центральным процессором получается в 6 разбольше за счёт работы конвейера. Поэтому и говорят, что, например, компьютер работает со скоростью 109 операций в секунду, (то есть, как бы выполняет по одной команде каждую наносекунду),хотя мы теперь знаем, что на самом деле выполнение каждой отдельной команды занимает в несколько раз больше времени.Разумеется, как всегда не всё обстоит так хорошо, как кажется с первого взгляда.
Первая неприятность поджидает нас, если одна из следующих команд использует результат работы предыдущейкоманды, а это случается достаточно часто по самой сути вычислительных алгоритмов. Например,пусть есть фрагмент программы:add al,[bx]sub X,alinc bxinc di1Конвейеры современных ЭВМ могут разбивать выполнения команд и на большее число шагов, например, уже в компьютере Pentium-IV конвейер состоял из 20 более мелких шагов.6Для второй команды этого фрагмента нельзя выполнять операцию вычитания, пока первая команда фрагмента не запишет в регистр al свой результат, т.е.
выполнится полностью и не сойдёт сконвейера.1 Таким образом, вторая команды должна быть задержана на третьей позиции конвейера(на четвёртой позиции уже надо читать операнд из регистра al, а этот операнд ещё не помещён вэтот регистр). Вместе со второй командой из нашего примера остановится, конечно, и выполнениеследующих за ней команд и на конвейере образуются два "пустых места".
В таблице 15.1 показанасхема движения команд из приведённого выше фрагмента программы на конвейере, каждая строкасоответствует одному шагу работы конвейера, пустые места закрашены.Таблица 15.1. Движение команд по конвейеру.Выборкаaddsubincincal,[bx]X,albxdiДекодированиеaddsubincincincincal,[bx]X,albxbxbxdiВычислениеадресовaddsubsubsubincincal,[bx]X,alX,alX,albxdiЧтениеоперандовВыполнениеоперацииЗаписьРезультатаadd al,[bx]add al,[bx]add al,[bx]sub X,alinc bxinc disub X,alinc bxinc disub X,alinc bxinc diЯсно, что скорость выполнения всей программы с такими, как говорят, зависимостями по данным, может при этом сильно упасть. Зная такую особенность работы конвейера, "умный" центральный процессор, исправляя оплошность программиста, может изменить порядок команд в машиннойпрограмме, получив, например, такой эквивалентный фрагмент программы: 2add al,[bx]inc bxinc disub X,alВот теперь, если построить таблицу состояний конвейера при выполнении этого фрагмента, толегко увидеть, что ячейки конвейера уже не будут пустовать.Другая неприятность в работе конвейера случается, когда на него поступает команда условногоперехода.
Что надо делать после выполнения этой команды, производить переход в другое местопрограммы, или же продолжить последовательное выполнение команд, выяснится только тогда, когда команда условного перехода сойдёт с конвейера. Так, спрашивается, из какой же ветви условногоперехода выбирать на конвейер следующую команду? Обычно при конструировании конвейера дляобработки команд условного перехода принимается какое-либо одно из следующих двух решений.Во-первых, можно выбирать команды из наиболее вероятной ветви условного оператора. Например, очевидно, что в нашем компьютере для команды цикла loop переход на повторение телацикла значительно более вероятен, чем выход из цикла вниз на следующую команду.
Для остальныхкоманд условного перехода центральный процессор может накапливать статистику, насколькочасто та или иная команда осуществляет переход, а не естественное продолжение программы. Этотметод называется в научной литературе предсказанием ветвления. Вероятность удачного предсказания ветвления у современных конвейерных ЭВМ может превышать 90%.1Такая зависимость между данными называется в научной литературе RAW (Read after Write – чтение после записи, т.е.
программа пытается читать ещё не записанный операнд). Путём рассуждений можно понять,что существуют и две другие зависимости между данными: WAR (Write after Read – запись после чтения) иWAR (Write after Write – запись после записи).2Переставлять команды в программе для её более эффективного выполнения можно поручить и компилятору. Такие компиляторы называются оптимизирующими компиляторами, оптимизация машинного кода программы выполняется обычно на одном или нескольких дополнительных проходах компилятора перед получением объектного модуля. Необходимо, однако, заметить, что оптимизирующие компиляторы обычно реализуются для языков высокого уровня и не занимаются оптимизацией собственно машинного кода.
В то же времясовременные процессоры (например, семейства Pentium) могут сами при выполнении программы (динамически) переставлять её команды для повышения производительности работы конвейера.7Во-вторых, можно поочерёдно выбирать на конвейер команды из обеих ветвей условного перехода. Разумеется, в этом случае половина команд будет выполняться зря и их потом "недоделанными" придётся выбросить с конвейера. В литературе этот метод называется спекулятивным выполнением (режущее для российского уха название связано с неудачным выбором значения соответствующего английского термина speculative: лучше переводить его не как спекулятивный, а как умозрительный, имея в виду умозрительное, а не настоящее движение алгоритма сразу по двум ветвямусловного перехода, что противоречит сути вычислительного процесса).Далее, как мы уже отмечали ранее, конвейер весьма болезненно реагирует на прерывания, таккак при этом производится автоматическое переключение на другую программу и конвейер приходится полностью очищать от частично выполненных команд предыдущей программы.1Ещё одна неприятность, связанная с функционированием конвейера, подстерегает нас, когда впрограмме возникает аварийная ситуация (в русскоязычной литературе сокращённо АВОСТ).
Этоможет быть деление на ноль, выполнение привилегированной команда в режиме пользователя, попытка нарушения защиты памяти, неверный код операции и т.д. Заметим, что теперь обработчик прерывания аварийной ситуации часто не сможет однозначно определить то место (конкретную команду) в программе пользователя, где возникла эта ситуация.Действительно, аварийную ситуацию может вызвать любая команда, находящаяся на конвейере,это, естественно, вызывает трудности при отладке программ (появляются, как их называют в специальной литературе, "неопределённые" прерывания, т.е.
прерывания с неопределённым местом ихвозникновения в программе). Заметим, что при упоминавшемся выше спекулятивном способе выполнения на конвейере условных переходов вообще возможны "ложные" прерывания в той ветви условного перехода, которая на самом деле не должна была выполняться. Здесь часто приходится идти набеспрецедентный шаг и откладывать обработку такого "сомнительного" прерывания до того момента, пока команда условного перехода не сойдёт с конвейера, и можно будет определить, произошло ли это прерывание "на самом деле".Ситуация ещё более запутывается, если в компьютере есть несколько конвейеров, например,один конвейер выполняет команды плавающей арифметики, а другой – все остальные команды.2 Вэтом случае, например, команда, стоящая в некотором фрагменте программы второй, может завершиться раньше, чем команда, стоящая первой.
Спрашивается, с какой команды возобновить выполнение программы после возврата из прерывания? Вот и приходится в нужные моменты искусственнотормозить работу одного из конвейеров, чтобы не нарушался естественный порядок следованиякоманд в программе. Как видим, конструкторам центральных процессоров современных ЭВМ не позавидуешь ☺.На этом мы закончим наше краткое знакомство с архитектурными особенностями современныхЭВМ, ориентированными на повышение производительности их работы, и перейдём к сравнениюмежду собой ЭВМ разных классов.15.2. ЭВМ различной архитектурыОтметим сейчас одно важное обстоятельство.