Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 144
Текст из файла (страница 144)
Так, пока выполняется операция команда 1, коканда 2нолучаетданныеисточника, команда Здекоднруется, а коканда 4 извлекается из памяти. Для выполнения каждой отдельной команды необходимо четыре машинных цикла, но каждый цикл завершает выполнение очередной команды, выполняя, таким образом, команды со скоростью полного цикла 1\П, если только удается всегда держать четыре команды в конвейере. Выполнение этого условия, однако, является весьма сложным делом и, как будет показано далее, ставит перед разработчиком языка непростые задачи.
+ Большая управляющая память. Чтобы избежать частых обращений к оперативной памяти, используется большой набор (часто 100 и более) регистров. Это увеличивает количество элсмевтов данных в управляющей памяти, позволяя реже обращаться за данными в оперативную память. + Быстрое инициирование процедур, Размещение записей активации в оперативной памяти (см. главу 9) часто требует больших затрат времени.
При использовании большого количества управляющих регистров в К1оС- процессоре стск записей активации подпрограмм во время выполнения часто размещается в управляющей памяти, Вызов подпрограммы и возврат из нее часто реализуются в виде соответствующих команд К13С-процессора. Такая идеология процессора должна учитываться разработчиками трансляторов. Например,встандартномС1БС-компьютереоператорЕ = А н В + С + Ов постфиксной записи будет имсть вид ЕАВ + С ь 0 ь = и выполняться следуюгдим образом; 620 Глаза 11.
Распределенная обработка данных 1) добавить А к В, получить сумму; 2) к сумме добавить С; 3) к сумме добавить В; 4) сохранить сумму в Е Но в конвейерной архитектуре команда 2 (к сумме добанить С) не может по- лучить необходимое ей значение суммы (результат сложения А и  — этап 3 н на- шем примере с конвейером), пока предыдущая команда (добавить А к В) не сохра- нит свой результат (этап 4 в конвейере). В итоге процессор вынужден ждать один цикл при выполнении команды 2, пока команда 1 не завершит свое выполнение. Более «сообразительный» транслятор предложил бы другую постфиксную запись, ЕАВ» СО + + -, которая позволила бы вычислять А + В однонременно с С» В и, та- ким образом, избежать задержки.
Бще более «сообразительный» транслятор мог бы чередовать выполнение отдельных операций двух незанисимых операторов, например: Е-А+В»С+В д-Е»6»Н+1 со следующей постфиксной записью АВ + ЕВ + СР » Н! + (!)(3) + (2)(4) + Е(5) Е(б) где номера операндов означают ноя(ера операций в этом постфиксном выражении. В этом случае каждый оператор выполняется без взаимного влияния со стороны другого и процессор работает с максимальной скоростью, возможной на конвейе- ре. Но при этом транслятору языка приходится обеспечивать отсутствие взаимно- говлиянияопсраторов.
Например,еслибывторойопсраторбылй:= Е + Я + Н +!, то операция ЕС+ не могла бы ньшолппться, пока не зансршнлось бы выполнение операции присваивания переменной Е из первого оператора. Что еще хуже, для максимального упрощения структуры процессора вся ответственность за подоб- ные решения часто нозлагастся на транслятор языка; аппаратная часть компьюте- ра просто выбирает соопштствующис, возможно, не корректные значения и про- должает свой цикл выполнения, Команды передачи управления налагаютдополнительные ограничения.
Напри- мер, для быстрого выполнения оператора )1 1( ехрг Епеп Мяц е)зе Мя(, последовательность выполнения на большинстве К1ЯС-компьютеров будет сле- дукппсй: + вычислить выражение ехрг; + поместить зтлс~ н копнейср; + если выражение ехрг ложно, то очистить конвейер и поместить в него зспг» Предполагая, что выражение будет истинно, ИВС-процессор может начать вы- полпеннс ветви 1))еп без остановки процессора на несколько циклон в ожидании того, что конвейер «поймает» необходимую последовательность операций. Но если выражение ложно, важно то, что никакие побочные вычисления, относящиеся к вет- ви С))еп, нс будут сохранены, Разработка программ, в которых большинство ветвей истинно, могло бы ускорить выполнение на машинах с К13С-арх!(тсктурой.
11.3. Развитие аппаратной части компьютера 521 11.3.2. Конструирование систем Увеличение скорости работы аппаратной части компьютера обычно достигается одним из двух способов. Псрвый способ заключается в том, что на гь1БС-компьютерах с конвейерной архитектурой несколько команд, обрабатывающих одни и те жс данные, вьпголняготся одновременно.
Альтернативный подход представляет компьютер со множеством потоков команд и множеством потоков даггггых' (Мп!- г1р!с 1пзггпсйоп Мп11гр1е Паса, М1МГ)), в котором различные инструкции, вьпюлняясь одновременно, обрабатывают различные данные. Мультипроцессоры не являются новейшей разработкой. Два и более ЦП, работающих под управлением одной операционной системы, известны вот уже около лвадцатн лет.
В простейшем случае операционная система просто назначает каждой пользовательской программе свой процессор, и взаимное влияние этих программ практически отсутствует. Суммарная производитслыюсть такой системы возрастает за счет наличия двух процессоров, по на скорость выполнения отдельной програьгмы это практически пе влияет. На рис.
11,5 представлены трп подхода к архитектуре системы с несколькими ЦП. На рис. 11.5, и представлен обычный подход к использованию нескольких процессоров в одной системс. Несколько процессоров взаимодействуют с несколькими модулями памяти посредством одного тракта данных, называелюго магистральной шилом. Эта архитектура является простейшей из всех рассматриваемых нами, по у нее есть относительно серьезный недостаток, заключающийся в том, что может возникнуть взаимное влияние доступа к данным различных процессоров. По этой причине общая г гроизводительность системы, состоящей из р процессоров с частотой л мегагерц каждый, будет значительно меньше, чем р х л.
~Р~ Процессоры Я Модули памяти Рио. 11.5. Системные архитектуры для мультипрацессоров: в — одна шина; б — матричный переключатель; в — омега-сеть В отечеетвен|юй литературе по вь|чнслнтельпой технике такие компьютеры еше называют компъютерами с векторно-кон иейернон архигвктурой. — Прикеч. науч.
лед 522 Глава 11. Распределенная обработка данных Вторая модель — это матричный переключатель, схематически представленный на рис. 11.5, б. В этой модели каждый процессор может быть по отдельности связан с отдельным модулем памяти, Хотя здесь мы можем достичь производительности р х Й мегагерц, но если у нас имеется т модулей памяти, то потребуется р х пг переключателей.
Это значительно увеличивает стоимость подобных систем. Промежуточным, компромиссным решением является так называемая архитектура омега-сегли (см. рис. 11.5, в). Здесь имеется набор переключателей, который позволяет связать по определенному маршруту каждый процессор с каждым модулем памяти. По сравнению с архитектурой матричных переключателей несколько уменьшается скорость из-за необходимости установления сетевого маршрута к данным, но цо сравнению с архитектурой магистральной шины имеется выигрыш в скорости, так как будет возникать несколько меньше случаев взаимного влияния данных. Стоимость такой архитектуры меньше по сравнению с архитектурой матричных переключателей, так как требуется меньшее число переключателей, но выше по сравнению с архитектурой магистральной шины.
С помощью каждого из представленных архитектурных решений операционная система может просто назначить выполнение различных задач на различных процессорах. В таком случае аппаратная часть никак не влияет на разработку языка программирования, и каждый процессор просто выполняет последовательную программу. Но сслн операционная система выделяет несколько процессоров для решения одной задачи, то в таком случае разработка языка играет рсшающую роль и в цей следует обратить внимание на механизмы реализации синхронизации задач, описанные в разделе 11.2.5. Компьютеры с массовым параллелизмом.
С использованием мультипроцессорной архитектуры мы можем иметь сотни и даже тысячи взаимосвязанных процессоров. Такие машины мы называем колгиьютерами с лгассовым параллелизмом. И здесь возни каст задача: как разделить программу на достаточно небольшие фрагменты, которые каждьп1 процессор мог бы выполнять независимо без того, чтобы потребности в данных одного процессора постоянно взаимодействовали с потребностями в данных другого процессора. Мы можем посмотреть па проблему параллельной организации вычислений с точки зрения низкоурощгего или еысокоуроеяего подхода. Высокоуровневые подходы зависят от конструкций языка, которые использованы программистом для организации параллельного выполнения. Оператор зпс' из раздела 11.2.1 является одним из методов, который может использовать программист, чтобы указать транслятору планировать выполнение каждого отдельного оператора на отдельном процессоре.
К сожалению, программисты редко способны вручную организовать параллельное выполнение программ эффективным образом, так что на практике такие подходы хорошо не работают, Прн низкоуровневом подходе элементарные конструкции языка, вычисление которых можно осуществить параллельно, определяются транслятором. Наиболее значимые примеры можно найти при обработке массивов. Во многих случаях (например, прп модслировашш потоков жидкости, потоков воздуха, обтекающих крыло самолета, или при прогнозировании погоды) точность решения зависит от числа пробных точек, используемых для исследования физических явлений.