Реализация высокоуровневых языков программирования
Быстрое развитие архитектур вычислительных систем привело к развитию новых технологий компиляции. Практически все высокопроизводительные системы используют преимущества двух основных технологий: параллелизм (parallelism) и иерархии памяти. Параллелизм можно найти на нескольких уровнях: на уровне команд, когда одновременно могут выполняться несколько команд, и на уровне процессора, когда различные потоки одного приложения выполняются на разных процессорах. Иерархии памяти представляют собой ответ на основное ограничение, накладываемое на память: можно иметь очень быструю или очень большую память, но нельзя иметь память одновременно и большую, и быструю.
Параллелизм
Все современные микропроцессоры используют параллелизм на уровне команд, однако этот параллелизм может быть скрыт от программиста. Программы пишутся так, как если бы все их команды выполнялись последовательно; аппаратное обеспечение динамически проверяет зависимости в потоке последовательных команд и по возможности выполняет их параллельно. В некоторых случаях машина включает аппаратный планировщик, который может изменять порядок команд для увеличения параллелизма программ. Независимо от того, используется ли такое аппаратное переупорядочение, компиляторы могут так генерировать целевой код, чтобы более эффективно использовать параллелизм на уровне команд.
Параллелизм на уровне команд может проявляться в наборе команд и явным образом. Машины VLIW (Very Long Instruction Word — очень длинное слово команды) имеют команды, которые могут выполнять несколько операций параллельно. Примером такой архитектуры может служить процессор Intel IA64. Все высокопроизводительные микропроцессоры общего назначения также включают команды, которые могут работать одновременно с векторами данных. Современные методы компиляции позволяют автоматически генерировать из последовательных программ код для таких машин.
Постепенно становятся преобладающими многопроцессорные системы — даже персональные компьютеры все чаще имеют несколько процессоров. Многопоточный код для работы в многопроцессорной среде может как явно писаться программистом, так и автоматически генерироваться компилятором из обычной последовательной программы. Такой компилятор скрывает от программистов детали обнаруженного в программе параллелизма, распределяя вычисления по процессорам компьютера и минимизируя необходимые синхронизацию и межпроцессорный обмен. Многие научно-вычислительные и инженерные приложения содержат интенсивные вычисления и могут эффективно использовать преимущества параллельной работы процессоров. В настоящее время имеются методы распараллеливания, которые автоматически транслируют последовательные научные программы в многопроцессорный код.
Иерархии памяти
Иерархия памяти состоит из нескольких уровней с различными скоростями и размерами, причем чем уровень ближе к процессору, тем выше его скорость и меньше размер. Среднее время обращения программы к памяти снижается, если большинство ее обращений удовлетворяется более быстрым уровнем в иерархии. Параллелизм и наличие иерархии памяти повышают потенциальную производительность компьютера, но компилятор должен приложить усилия, чтобы эта потенциальная производительность машины стала реальной производительностью приложения.
Иерархии памяти имеются на всех машинах. Процессор обычно использует небольшое количество регистров объемом в десятки байтов, несколько уровней кэш-памяти объемом от килобайтов до мегабайтов, физической памяти — от мегабайтов до гигабайтов и вторичную память — от гигабайтов и выше. Соответственно, скорость доступа к соседним в иерархии уровням памяти может отличаться на два или три порядка. Зачастую производительность системы ограничена не скоростью процессора, а производительностью подсистемы памяти. В то время как традиционно компиляторы уделяли большее внимание оптимизации работы процессора, сегодня больший упор следует делать на более эффективное использование иерархии памяти.
Эффективное использование регистров — пожалуй, самая важная задача оптимизации программы. Но в отличие от регистров, которые должны явно управляться программным обеспечением, кэши и физическая память скрыты от набора команд и управляются аппаратным обеспечением. Как выяснилось, политики управления кэшами, реализуемые аппаратным обеспечением, в ряде случаев неэффективны, в частности в научных вычислениях с большими структурами данных (обычно массивами). Повысить эффективность иерархии памяти можно путем изменения размещения данных или порядка команд, обращающихся к данным. Можно также изменить размещение кода для повышения эффективности кэшей команд.
Быстрое развитие архитектур вычислительных систем привело к развитию новых технологий компиляции. Практически все высокопроизводительные системы используют преимущества двух основных технологий: параллелизм (parallelism) и иерархии памяти. Параллелизм можно найти на нескольких уровнях: на уровне команд, когда одновременно могут выполняться несколько команд, и на уровне процессора, когда различные потоки одного приложения выполняются на разных процессорах. Иерархии памяти представляют собой ответ на основное ограничение, накладываемое на память: можно иметь очень быструю или очень большую память, но нельзя иметь память одновременно и большую, и быструю.
Параллелизм
Все современные микропроцессоры используют параллелизм на уровне команд, однако этот параллелизм может быть скрыт от программиста. Программы пишутся так, как если бы все их команды выполнялись последовательно; аппаратное обеспечение динамически проверяет зависимости в потоке последовательных команд и по возможности выполняет их параллельно. В некоторых случаях машина включает аппаратный планировщик, который может изменять порядок команд для увеличения параллелизма программ. Независимо от того, используется ли такое аппаратное переупорядочение, компиляторы могут так генерировать целевой код, чтобы более эффективно использовать параллелизм на уровне команд.
Параллелизм на уровне команд может проявляться в наборе команд и явным образом. Машины VLIW (Very Long Instruction Word — очень длинное слово команды) имеют команды, которые могут выполнять несколько операций параллельно. Примером такой архитектуры может служить процессор Intel IA64. Все высокопроизводительные микропроцессоры общего назначения также включают команды, которые могут работать одновременно с векторами данных. Современные методы компиляции позволяют автоматически генерировать из последовательных программ код для таких машин.
Постепенно становятся преобладающими многопроцессорные системы — даже персональные компьютеры все чаще имеют несколько процессоров. Многопоточный код для работы в многопроцессорной среде может как явно писаться программистом, так и автоматически генерироваться компилятором из обычной последовательной программы. Такой компилятор скрывает от программистов детали обнаруженного в программе параллелизма, распределяя вычисления по процессорам компьютера и минимизируя необходимые синхронизацию и межпроцессорный обмен. Многие научно-вычислительные и инженерные приложения содержат интенсивные вычисления и могут эффективно использовать преимущества параллельной работы процессоров. В настоящее время имеются методы распараллеливания, которые автоматически транслируют последовательные научные программы в многопроцессорный код.
Иерархии памяти
Иерархия памяти состоит из нескольких уровней с различными скоростями и размерами, причем чем уровень ближе к процессору, тем выше его скорость и меньше размер. Среднее время обращения программы к памяти снижается, если большинство ее обращений удовлетворяется более быстрым уровнем в иерархии. Параллелизм и наличие иерархии памяти повышают потенциальную производительность компьютера, но компилятор должен приложить усилия, чтобы эта потенциальная производительность машины стала реальной производительностью приложения.
Иерархии памяти имеются на всех машинах. Процессор обычно использует небольшое количество регистров объемом в десятки байтов, несколько уровней кэш-памяти объемом от килобайтов до мегабайтов, физической памяти — от мегабайтов до гигабайтов и вторичную память — от гигабайтов и выше. Соответственно, скорость доступа к соседним в иерархии уровням памяти может отличаться на два или три порядка. Зачастую производительность системы ограничена не скоростью процессора, а производительностью подсистемы памяти. В то время как традиционно компиляторы уделяли большее внимание оптимизации работы процессора, сегодня больший упор следует делать на более эффективное использование иерархии памяти.
Эффективное использование регистров — пожалуй, самая важная задача оптимизации программы. Но в отличие от регистров, которые должны явно управляться программным обеспечением, кэши и физическая память скрыты от набора команд и управляются аппаратным обеспечением. Как выяснилось, политики управления кэшами, реализуемые аппаратным обеспечением, в ряде случаев неэффективны, в частности в научных вычислениях с большими структурами данных (обычно массивами). Повысить эффективность иерархии памяти можно путем изменения размещения данных или порядка команд, обращающихся к данным. Можно также изменить размещение кода для повышения эффективности кэшей команд.
Комментариев нет:
Отправить комментарий