Сервер - статьи

       

IA-64 ISA


Для решения этих проблем Intel стала действовать в разных направлениях. Первое связано с созданием архитектуры для новых приложений. Для удачной оптимизации было решено, что процессор должен обрабатывать не команды, а группы команд - связки (instruction bundles), - состоящие из нескольких инструкций определенного типа. Архитектура IA-64 предусматривает хранение трех команд в одной связке, причем каждая связка открывается шаблоном, предписывающим выполнение этой связки определенными исполнительными модулями. Это было сделано для того, чтобы избежать перегруппировки команд, на которую раньше CISC- и RISC-процессоры затрачивали достаточно много времени, чтобы параллельно выполняемые команды не влияли на результаты друг друга. В случае EPIC это делает не процессор, а компилятор: он собирает независимые друг от друга команды в блоки, и процессор может сразу же начинать параллельное выполнение, не заботясь о проверке их совместимости. Тем самым достигается существенное ускорение, но только для тех программ, которые предварительно были обработаны компилятором. Отсюда и получается, что 16- и 32-разрядные программы будут работать со значительно меньшей скоростью.

Новый набор команд сильно упрощен, из него исключены инструкции с высокой латентностью (деления, целочисленного умножения и т. п.). Безусловно, это увеличивает объем кода, поскольку необходима эмуляция сложных команд, но увеличение параллелизма, позволяющего одновременно проводить несколько вычислений, с лихвой покрывает такие потери. Имеются и расширения системы команд. Это новые команды для вычислений с плавающей точкой (команда умножения с накоплением, команды поиска максимума и минимума) и семантически совместимые с MMX мультимедийные команды, производящие параллельные вычисления над восемью 8-битными, четырьмя 16-битными или двумя 32-битными целочисленными операндами. Большинство команд - многооперандные, операции проводятся только над регистрами, а для работы с памятью существует специальная группа команд.

Инструкции имеют унифицированную длину 41 бит и упаковываются в связки по 128 бит для выравнивания.
Шаблон в связке описывает, к каким исполнительным модулям направляется каждая из команд, а также границы разделения групп команд. Это сильно упрощает декодирование команд процессором. Связки могут выполняться процессором параллельно, и от того, насколько удачно удается компилятору "распараллелить" исходный код приложения, зависит эффективность выполнения приложения в целом. Любая команда может быть выполнена задолго до ее истинного месторасположения, при этом она может вызвать исключение (exception). При выполнении такой операции исключение откладывается до точки оригинального месторасположения. В этой точке специальной командой производится проверка на удачность спекуляции. Этот механизм получил название спекулятивного ветвления. Таким образом, проблема предсказания ветвлений решается в рамках новой идеологии более эффективно. Для "отметки" ветвлений после исследования их процессором используются предикатные регистры. Затем, если процессор встречает "отмеченное" ветвление в процессе выполнения программы, он начинает одновременно выполнять все ветви. После того как будет определена "истинная" ветвь, процессор сохраняет необходимые результаты и сбрасывает остальные. Этот механизм позволяет полностью избавится от простых условных переходов, но приводит к необходимости выполнять обе ветви программы одновременно, что может снизить производительность при несбалансированных ветвях программы. Для дополнительного снижения количества ошибок на условных переходах введен ряд оригинальных механизмов: подсказки ветвлений, подсказки предвыборки, переходы по косвенным адресам с использованием регистра ветвлений, адрес в котором используется процессором как подсказка на точку ветвления, специальные команды организации цикла с хорошим предсказанием начала и завершения. Технология спекулятивной загрузки позволяет заранее загрузить данные из памяти в один из регистров. Механизм регистрового стека позволяет не сохранять лишний раз содержимое регистров при вызове функций.


Это достигается тем, что регистры с 32 по 128 являются стековыми и переименовываются при вывозе функций. Их можно использовать для передачи параметров. Механизм "вращения регистров" позволяет параллельно выполнять команды из разных итераций цикла. Для программной поддержки всего этого Intel предлагает все необходимое ПО для разработки приложений нового типа (со старыми уже ничего не сделаешь). Практика показывает, что после оптимизации приложений можно достичь полуторного прироста производительности. В качестве исходников предлагаются библиотеки MKL и IPP. MKL (Math Kernel Library) предназначена для научных вычислений и оптимизирована как для 32-битных, так и для 64-битных многопроцессорных систем. Основаны они на C/C++ и Fortran. MKL описывает базовые функции BLAS для матриц и векторов. Имеется поддержка упакованных функций и векторых VML для больших массивов данных. Причем библиотека выпускается как под Windows, так и под Linux. Недавно вышел Intel C++ Compiler версии 6. IPP (Integrated Performance Primitives) содержит низкоуровневые программные примитивы, общие для всех процессоров и процессорозависимые функции обработки сигналов, видео, аудио и графики. Поддерживается большое количество типов и массивов данных. Компилятор Intel также создан для Windows и Linux и поддерживает кросс-платформенную компиляцию. Главной его особенностью является возможность автоматической векторизации для NetBurst и программной конвейеризации для EPIC. Он поддерживает автоматическое распараллеливание вычислений, технологию Hyper-Threading и SMP. На уровне компилятора можно организовать предвыборку команд (prefetching). При применении компилятора на различных платформах он поддерживает автоматическое определение процессора. Производительность его не очень сильно отличается от ассемблера! Assure Thread Analyzer - это автоматический отладчик для многопоточных приложений, поставляемый Intel. Пока что он оптимизирован только под Hyper-Threading, но в будущем сможет также поддерживать кластеры.Intel VTune Performance Analyzer - очень интересная вещь, которая позволяет обнаруживать "узкие места" в приложениях и его причины. Например, он может определить наиболее часто исполняемые операции, вызываемые функции и оптимизировать их местоположение в исходном коде. Он поддерживает 32 и 64-разрядные платформы Java, C#, .NET. Ну что ж, можно сказать, IA-64 - это действительно перспективный рывок в будущее 64-битных систем.

Содержание раздела