А.В. Ахо, М.С. Лам, Р. Сети, Дж. Д. Ульман - Компиляторы - принципы, технологии и инструментарий (1114947), страница 10
Текст из файла (страница 10)
В некоторых случаях машина включает аппаратный планировщик, который может изменять порядок команд для увеличения параллелизма программ. Независимо от того, используется ли такое аппаратное переупорядочение, компиляторы могут так генерировать целевой код, чтобы более эффективно использовать параллелизм на уровне команд. Параллелизм на уровне команд может проявляться в наборе команд и явным образом. Машины Ч1,!% (Чету 1.опя 1пв!гпсйоп %огб — очень длинное слово команды) имеют команды, которые могут выполнять несколько операций параллельно. Примером такой архитектуры может служить процессор 1и!е! 1А64.
Все высокопроизводительные микропроцессоры общего назначения также включают команды, которые могут работать одновременно с векторами данных. Современные методы компиляции позволяют автоматически генерировать из последовательных программ код для таких машин. Постепенно становятся преобладаюшими многопроцессорные системы — даже персональные компьютеры все чаще имеют несколько процессоров. Многопоточный код для работы в многопроцессорной среде может как явно писаться программистом, так и автоматически генерироваться компилятором из обычной последовательной программы.
Такой компилятор скрывает от программистов детали обнаруженного в программе параллелизма, распределяя вычисления по процессорам компьютера и минимизируя необходимые синхронизацию и межпроцессорный обмен. Многие научно-вычислительные и инженерные приложения содержат интенсивные вычисления и могут эффективно использовать преимущества параллельной работы процессоров. В настоящее время имеются методы распараллеливания, которые автоматически транслируют последовательные научные программы в многопроцессорный код.
Иерархии памяти Иерархия памяти состоит из нескольких уровней с различными скоростями и размерами, причем чем уровень ближе к процессору, тем выше его скорость и меньше размер. Среднее время обращения программы к памяти снижается, если большинство ее обращений удовлетворяется более быстрым уровнем в иерархии. Параллелизм и наличие иерархии памяти повышают потенциальную производительность компьютера, но компилятор должен приложить усилия, чтобы эта по- 52 Глава 1. Введение в компиляцию тенциальная производительность машины стала реальной производительностью приложения. Иерархии памяти имеются на всех машинах.
Процессор обычно использует небольшое количество регистров объемом в десятки байтов, несколько уровней кэш-памятн объемом от килобайтов до мегабайтов, физической памяти — от мегабайтов до гигабайтов и вторичную память — от гигабайтов и выше. Соответственно, скорость доступа к соседним в иерархии уровням памяти может отличаться на два или три порядка. Зачастую производительность системы ограничена не скоростью процессора, а производительностью подсистемы памяти. В то время как традиционно компиляторы уделяли большее внимание оптимизации работы процессора, сегодня больший упор следует делать на более эффективное использование иерархии памяти.
Эффективное использование регистров — пожалуй, самая важная задача оптимизации программы. Но в отличие от регистров, которые должны явно управляться программным обеспечением, кэши и физическая память скрыты от набора команд и управляются аппаратным обеспечением. Как выяснилось, политики управления кэшами, реализуемые аппаратным обеспечением, в ряде случаев неэффективны, в частности в научных вычислениях с большими структурами данных (обычно массивами). Повысить эффективность иерархии памяти можно путем изменения размещения данных или порядка команд, обращаюгцихся к данным.
Можно также изменить размещение кода для повышения эффективности кэшей команд. 1.5.3 Разработка новых архитектур компьютеров В свое время, на заре компьютерной эры, компиляторы разрабатывались после того, как создавались компьютеры. С тех пор ситуация изменилась, Поскольку программирование на языках высокого уровня стало нормой, производительность вычислительных систем определяется не просто скоростью процессоров, но и тем, насколько хорошо компиляторы могут использовать их новые возможности.
Таким образом, при разработке архитектур современных вычислительных сисгем компиляторы разрабатываются на стадии проектирования процессора, и скомпилированный код, выполняемый на имитаторах, используется для оценки предлагаемых архитектурных возможностей. вхяЯС Одним из хорошо известных примеров, когда компиляторы повлияли на разработку архитектуры компьютера, было изобретение архитектуры К1ЯС (Кейнса 1пз~пясбоп-Вез Согпрц1ег — компьютер с сокращенным набором команд). До этого изобретения основная тенденция состояла в разработке все более сложных наборов команд, предназначенных для упрощения программирования на языке 1.5. Применения технологий компиляторов 53 ассемблера; такие архитектуры известны как С)БС (Сошр1ех 1пз1гцс11оп-Бе! Сошрц1ег — компьютер со сложным набором команд).
Например, набор команд С!ЯС включает сложные режимы адресации памяти для поддержки обращения к структурам, а также команды вызова процедур с сохранением регистров и передачей параметров в стеке. Методы оптимизации зачастую способны свести такие команды к небольшому количеству более простых операций, устраняя избыточность сложных команд. Таким образом, желательно построить простые наборы команд, которые способны эффективно использоваться компиляторами и существенно облегчить оптимизацию аппаратного обеспечения. Большинство архитектур процессоров общего назначения, включая РопегРС, БРАКС, М1РБ, А1рйа и РА-К1ЯС, основаны на концепции К1ЯС.
Хотя архитектура х86 — наиболее популярного процессора — имеет набор команд С1ЯС, при реализации этого процессора применены многие идеи, разработанные для К1ЯС- машин. Более того, самый эффективный способ использования высокопроизводительных компьютеров х86 состоит в использовании только простейших команд процессора. Специализированные архитектуры За последние три десятилетия было предложено множество архитектурных концепций, включающих потоковые машины (ба!а йои шасЬ)пе), векторные машины, машины Н).1% (Негу 1.опй!пя1гпс11оп %ого — архитектура с командными словами очень большой длины), Б!МР (51пй!е 1пя1гасйоп, Мп!бр!е Раса — один поток команд, много потоков данных), массивы процессоров, систолические матрицы, мультипроцессоры с разделяемой памятью и мультипроцессоры с распределенной памятью.
Разработка каждой из этих архитектурных концепций сопровождалась исследованиями и разработкой соответствующих технологий компиляции. Некоторые из перечисленных идей нашли свое место во встраиваемых машинах. Поскольку целая система может быть собрана в виде единой схемы, процессоры больше не рассматриваются как отдельные товарные единицы, зато могут изготавливаться на заказ для достижения наивысшей эффективности решения тех или иных задач. Таким образом, в отличие от процессоров общего назначения, когда экономика заставляет использовать, по сути, единые архитектурные решения, специализированные процессоры для конкретных приложений демонстрируют огромное разнообразие архитектурных решений. Технологии компиляции должны не только поддерживать программирование для таких архитектур, но и участвовать в принятии решения об использовании той или иной архитектуры. 54 Глава 1.
Введение в компиляцию 1.5.4 Трансляции программ Хотя обычно мы рассматриваем компиляцию как трансляцию с высокоуровневого языка программирования на машинный уровень, та же технология применима и для трансляции между различными видами языков программирования. Далее приведены некоторые важные применения технологии трансляции.
Бинарная трансляция Методы компиляции могут использоваться для трансляции бинарного кода для одной машины в код для другой, обеспечивая выполнение машиной программы, изначально скомпилированной для другого набора машинных команд. Методы бинарной трансляции использовались различными компьютерными компаниями для повышения доступности программного обеспечения для их машин. В частности, доминирование рынка персональных компьютеров с процессорами х86 привело к тому, что большая часть программного обеспечения оказалась доступна в виде кода для х86.
Были разработаны бинарные трансляторы для конвертации кода х86 в коды А!Рпа и пирагс. Бинарная трансляция использовалась также фирмой Т~аттега, Упс. в реализации набора команд х86. Процессор Тгапяпе!а Сгпяое представлял собой 1ч'1%-процессор, который вместо выполнения сложных команд х86 непосредственно аппаратным обеспечением использовал трансляцию для конвертации кода х86 в код 1Л~1%. Бинарная трансляция может также использоваться для обеспечения обратной совместимости. Когда процессоры в Арр!е Мас1п!оап в 1994 году были сменены с Мо!ого!а МС 68040 на Рои егРС, то для того, чтобы процессоры РоччегРС могли выполнять старый код МС 68040, использовалась бинарная трансляция. Аппаратный синтез На высокоуровневых языках пишется не только программное обеспечение; даже проектирование аппаратного обеспечения, в основном, описывается с помощью специализированных высокоуровневых языков, предназначенных для описания аппаратного обеспечения, таких как чег!!о8 и ЧНРЬ ('чету 'и!8п арееб !и!ейга!ед с!гсп!! Нагбччаге Пеасг!р!!оп 1апйпайе — язык описания очень высокоскоростных интегральных схем аппаратного обеспечения).
Дизайн аппаратного обеспечения обычно описывается на уровне регистровых передач (ВТБ — Вей!а!ег Тгапагег 1.ече!), где переменные представляют регистры, а выражения — комбинационные логические схемы. Инструментарий аппаратного синтеза автоматически транслирует ВТБ-описания в логические вентили, которые отображаются в транзисторы и в конечном счете — в физические схемы.