пятница, 3 августа 2012 г.

Оптимизация для архитектуры компьютера

Реализация высокоуровневых языков программирования

Быстрое развитие архитектур вычислительных систем привело к развитию но­вых технологий компиляции. Практически все высокопроизводительные системы используют преимущества двух основных технологий: параллелизм (parallelism) и иерархии памяти. Параллелизм можно найти на нескольких уровнях: на уровне команд, когда одновременно могут выполняться несколько команд, и на уровне процессора, когда различные потоки одного приложения выполняются на разных процессорах. Иерархии памяти представляют собой ответ на основное ограничение, накладываемое на память: можно иметь очень быструю или очень большую память, но нельзя иметь память одновременно и большую, и быструю.


Параллелизм

Все современные микропроцессоры используют параллелизм на уровне ко­манд, однако этот параллелизм может быть скрыт от программиста. Программы пишутся так, как если бы все их команды выполнялись последовательно; аппарат­ное обеспечение динамически проверяет зависимости в потоке последовательных команд и по возможности выполняет их параллельно. В некоторых случаях маши­на включает аппаратный планировщик, который может изменять порядок команд для увеличения параллелизма программ. Независимо от того, используется ли та­кое аппаратное переупорядочение, компиляторы могут так генерировать целевой код, чтобы более эффективно использовать параллелизм на уровне команд.

Параллелизм на уровне команд может проявляться в наборе команд и яв­ным образом. Машины VLIW (Very Long Instruction Word — очень длинное слово команды) имеют команды, которые могут выполнять несколько операций парал­лельно. Примером такой архитектуры может служить процессор Intel IA64. Все высокопроизводительные микропроцессоры общего назначения также включают команды, которые могут работать одновременно с векторами данных. Современ­ные методы компиляции позволяют автоматически генерировать из последова­тельных программ код для таких машин.

Постепенно становятся преобладающими многопроцессорные системы — да­же персональные компьютеры все чаще имеют несколько процессоров. Много­поточный код для работы в многопроцессорной среде может как явно писаться программистом, так и автоматически генерироваться компилятором из обычной последовательной программы. Такой компилятор скрывает от программистов де­тали обнаруженного в программе параллелизма, распределяя вычисления по про­цессорам компьютера и минимизируя необходимые синхронизацию и межпро­цессорный обмен. Многие научно-вычислительные и инженерные приложения содержат интенсивные вычисления и могут эффективно использовать преиму­щества параллельной работы процессоров. В настоящее время имеются методы распараллеливания, которые автоматически транслируют последовательные науч­ные программы в многопроцессорный код.

Иерархии памяти

Иерархия памяти состоит из нескольких уровней с различными скоростями и размерами, причем чем уровень ближе к процессору, тем выше его скорость и меньше размер. Среднее время обращения программы к памяти снижается, если большинство ее обращений удовлетворяется более быстрым уровнем в иерархии. Параллелизм и наличие иерархии памяти повышают потенциальную производи­тельность компьютера, но компилятор должен приложить усилия, чтобы эта потенциальная производительность машины стала реальной производительностью приложения.

Иерархии памяти имеются на всех машинах. Процессор обычно использует небольшое количество регистров объемом в десятки байтов, несколько уровней кэш-памяти объемом от килобайтов до мегабайтов, физической памяти — от мега­байтов до гигабайтов и вторичную память — от гигабайтов и выше. Соответствен­но, скорость доступа к соседним в иерархии уровням памяти может отличаться на два или три порядка. Зачастую производительность системы ограничена не скоростью процессора, а производительностью подсистемы памяти. В то время как традиционно компиляторы уделяли большее внимание оптимизации работы процессора, сегодня больший упор следует делать на более эффективное исполь­зование иерархии памяти.

Эффективное использование регистров — пожалуй, самая важная задача оп­тимизации программы. Но в отличие от регистров, которые должны явно управ­ляться программным обеспечением, кэши и физическая память скрыты от набо­ра команд и управляются аппаратным обеспечением. Как выяснилось, политики управления кэшами, реализуемые аппаратным обеспечением, в ряде случаев неэф­фективны, в частности в научных вычислениях с большими структурами данных (обычно массивами). Повысить эффективность иерархии памяти можно путем изменения размещения данных или порядка команд, обращающихся к данным. Можно также изменить размещение кода для повышения эффективности кэшей команд.

Комментариев нет:

Отправить комментарий