Какие подходы применяемые в архитектурах компьютеров позволяли повысить их производительность
Измерения производительности
Для приведенных тестов использовался однопроцессорный сервер на базе Xeon E3-1240 3,3 ГГц (тактовая частота была фиксирована, поэтому пиковая производительность с двойной точностью была равна 26,4 GFLOPS) с памятью DDR3 8 Гбайт с симметричным заселением обоих каналов памяти. Некоторые результаты были сопоставлены с [ 3 ] для двухпроцессорного сервера с четырехъядерными Xeon E5520 2,27 ГГц (c микроархитектурой Nehalem) и памятью DDR2-1066 емкостью 12 Гбайт, расселенной равномерно по шести каналам памяти. Измерения проводились в 64-разрядной среде OpenSuSE 11.4 с использованием, в частности, Intel Fortran XE Composer 2011 версии 12.1/6.233 и библиотеки математических программ MKL 10.3.
Тесты Linpack при размерности задачи n=100 (табл. 2) являются хорошей оценкой производительности с плавающей запятой — влияние памяти здесь отсутствует, поскольку задача хорошо локализуется в кэше. Для ключей компиляции -fast и -xAVX достигается производительность 4,7 GFLOPS, но если ограничиться применением кодов SSE4.2 (-xSSE4.2), то производительность будет 5,0 GFLOPS. Не всегда применение команд AVX дает более высокую производительность.
Таблица 2. Производительность сервера на базе Xeon E3-1240 на некоторых последовательных тестах |
Интересно сравнить эти данные с результатами для Nehalem (2,6 GFLOPS), пересчитав производительность на единицу тактовой частоты, — окажется, что производительность ядра Sandy Bridge по сравнению с Nehalem выросла на 36%.
Данные тестов Linpack при n=1000 представляют аналогичный интерес, но здесь результаты определяются производительностью работы оптимизированных модулей (dgetrf, dgetrs) библиотеки MKL. На одном ядре при этом достигается производительность 18,9 GFLOPS, сопоставимая с пиковой, а в расчете на единицу тактовой частоты по сравнению с Nehalem производительность возросла на 71%. Это неплохое доказательство эффективности расширения числа устройств с плавающей запятой в Sandy Bridge. Распараллеливание теста на два и четыре ядра (табл. 2) следует признать вполне удовлетворительным.
Производительность ядра E3-1240 при умножении больших матриц (с применением MKL-модуля dgemm, n=8000) в расчете на единицу тактовой частоты возросла почти вдвое и составляет 24,7 GFLOPS — около 94% от пикового значения.
Результаты стандартных для оценки пропускной способности памяти тестов stream особенно важны для чувствительных к этому показателю приложений (например, вычислительной гидродинамики). Для многоядерных процессоров всегда встает проблема распределения пропускной способности между ядрами, которые могут вступать в конфликт по доступу в память — эта ситуация была обнаружена и в E3-1240.
Компиляция с ключами -fast -openmp (-xSSE4.2 слабо влияет на результат по сравнению с -xAVX) уже и на одном ядре позволяет достигнуть пропускной способности до 17,7 Гбайт/с (табл. 3), что достаточно близко к пиковому значению — 21,3 Гбайт/с для двух каналов DDR3-1333. На двух ядрах пропускная способность возрастает до 18,8 Гбайт/с, а на четырех уже уменьшается. Если компилятор не может так оптимизировать, как компилятор Intel (например, gfortran версий до 4.6.0 без поддержки Sandy Bridge), то масштабирование с числом ядер может быть выше.
Таблица 3. Производительность с распараллеливанием |
Таблица 4. Ускорение при расчетах по Gaussian-09 |
В качестве иллюстрации распараллеливания реальных приложений приведены данные по задачам молекулярного моделирования (табл. 4) в квантовой химии, в рамках пакета Gaussian-09 [ 4 ]. В расчетах использованы молекулы тринитротриаминобензола (из стандартного test178, методом CIS), валиномицина (test397, DFT) и фуллерена C60 (DFT c расчетом частот), все — без учета симметрии.
Данные табл. 4 говорят о хорошем распараллеливании всех этих задач. Для фуллерена даже без перетрансляции кодов Gaussian-09 (под E3) при выполнении на Sandy Bridge производительность ядра E3-1240 в расчете на единицу тактовой частоты выше, чем у Nehalem.
Литература
- “Intel 64 and IA-32 Architectures Optimization Reference Manual”, 248966-025, Intel, June 2011.
- “Intel Advanced Vector Extensions Programming Reference”, 319433-011, Intel, June 2011.
- Михаил Кузьминский, Nehalem: микроархитектура и производительность , Открытые системы. СУБД, № 8, 2009.
- Gaussian 09, Revision A.02, M. J. Frisch e.a., Gaussian, Inc., Wallingford CT, 2009.
2.4. Технологии повышения производительности процессоров
Системы команд процессора. Регистры процессоров: сущность, назначение, типы. Параллелизм вычислений. Конвейеризация вычислений.
В общем случае система команд процессора включает в себя следующие четыре основные группы команд:
· команды пересылки данных;
Команды пересылки данных не требуют выполнения никаких операций над операндами. Операнды просто пересылаются (точнее, копируются) из источника (Source) в приемник (Destination). Источником и приемником могут быть внутренние регистры процессора, ячейки памяти или устройства ввода/вывода. АЛУ в данном случае не используется.
Арифметические команды выполняют операции сложения, вычитания, умножения, деления, увеличения на единицу (инкрементирования), уменьшения на единицу (декрементирования) и т.д. Этим командам требуется один или два входных операнда. Формируют команды один выходной операнд.
Логические команды производят над операндами логические операции, например, логическое И, логическое ИЛИ, исключающее ИЛИ, очистку, инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим, требуется один или два входных операнда, и формируют они один выходной операнд.
Наконец, команды переходов предназначены для изменения обычного порядка последовательного выполнения команд. С их помощью организуются переходы на подпрограммы и возвраты из них, всевозможные циклы, ветвления программ, пропуски фрагментов программ и т.д. Команды переходов всегда меняют содержимое счетчика команд. Переходы могут быть условными и безусловными. Именно эти команды позволяют строить сложные алгоритмы обработки информации.
В соответствии с результатом каждой выполненной команды устанавливаются или очищаются биты регистра состояния процессора (PSW). Но надо помнить, что не все команды изменяют все имеющиеся в PSW флаги. Это определяется особенностями каждого конкретного процессора.
У разных процессоров системы команд существенно различаются, но в основе своей они очень похожи. Количество команд у процессоров также различно. Например, у упоминавшегося уже процессора МС68000 всего 61 команда, а у процессора 8086 — 133 команды. У современных мощных процессоров количество команд достигает нескольких сотен. В то же время существуют процессоры с сокращенным набором команд (так называемые RISC-процессоры), в которых за счет максимального сокращения количества команд достигается увеличение эффективности и скорости их выполнения.
Команды пересылки данных
Команды пересылки данных занимают очень важное место в системе команд любого процессора. Они выполняют следующие важнейшие функции:
загрузка (запись) содержимого во внутренние регистры процессора;
сохранение в памяти содержимого внутренних регистров процессора;
копирование содержимого из одной области памяти в другую;
запись в устройства ввода/вывода и чтение из устройств ввода/вывода.
В некоторых процессорах (например, Т-11) все эти функции выполняются одной единственной командой MOV (для байтовых пересылок — MOVB) но с различными методами адресации операндов.
В других процессорах помимо команды MOV имеется еще несколько команд для выполнения перечисленных функций. Например, для загрузки регистров могут использоваться команды загрузки, причем для разных регистров — разные команды (их обозначения обычно строятся с использованием слова LOAD — загрузка). Часто выделяются специальные команды для сохранения в стеке и для извлечения из стека (PUSH — сохранить в стеке, POP — извлечь из стека). Эти команды выполняют пересылку с автоинкрементной и с автодекрементной адресацией (даже если эти режимы адресации не предусмотрены в процессоре в явном виде).
Иногда в систему команд вводится специальная команда MOVS для строчной (или цепочечной) пересылки данных (например, в процессоре 8086). Эта команда пересылает не одно слово или байт, а заданное количество слов или байтов (MOVSB), то есть инициирует не один цикл обмена по магистрали, а несколько. При этом адрес памяти, с которым происходит взаимодействие, увеличивается на 1 или на 2 после каждого обращения или же уменьшается на 1 или на 2 после каждого обращения. То есть в неявном виде применяется автоинкрементная или автодекрементная адресация.
В некоторых процессорах (например, в процессоре 8086) специально выделяются функции обмена с устройствами ввода/вывода. Команда IN используется для ввода (чтения) информации из устройства ввода/вывода, а команда OUT используется для вывода (записи) в устройство ввода/вывода. Обмен информацией в этом случае производится между регистром-аккумулятором и устройством ввода/вывода. В более продвинутых процессорах этого же семейства (начиная с процессора 80286) добавлены команды строчного (цепочечного) ввода (команда INS) и строчного вывода (команда OUTS). Эти команды позволяют пересылать целый массив (строку) данных из памяти в устройство ввода/вывода (OUTS) или из устройства ввода/вывода в память (INS). Адрес памяти после каждого обращения увеличивается или уменьшается (как и в случае с командой MOVS).
Также к командам пересылки данных относятся команды обмена информацией (их обозначение строится на основе слова Exchange). Может быть предусмотрен обмен информацией между внутренними регистрами, между двумя половинами одного регистра (SWAP) или между регистром и ячейкой памяти.
Арифметические команды рассматривают коды операндов как числовые двоичные или двоично-десятичные коды. Эти команды могут быть разделены на пять основных групп:
· команды операций с фиксированной запятой (сложение, вычитание, умножение, деление);
· команды операций с плавающей запятой (сложение, вычитание, умножение, деление);
· команды инкремента и декремента;
Команды операций с фиксированной запятой работают с кодами в регистрах процессора или в памяти как с обычными двоичными кодами. Команда сложения (ADD) вычисляет сумму двух кодов. Команда вычитания (SUB) вычисляет разность двух кодов. Команда умножения (MUL) вычисляет произведение двух кодов (разрядность результата вдвое больше разрядности сомножителей). Команда деления (DIV) вычисляет частное от деления одного кода на другой. Причем все эти команды могут работать как с числами со знаком, так и с числами без знака.
Команды операций с плавающей запятой (точкой) используют формат представления чисел с порядком и мантиссой (обычно эти числа занимают две последовательные ячейки памяти). В современных мощных процессорах набор команд с плавающей запятой не ограничивается только четырьмя арифметическими действиями, а содержит и множество других более сложных команд, например, вычисление тригонометрических функций, логарифмических функций, а также сложных функций, необходимых при обработке звука и изображения.
Команды очистки (CLR) предназначены для записи нулевого кода в регистр или ячейку памяти. Эти команды могут быть заменены командами пересылки нулевого кода, но специальные команды очистки обычно выполняются быстрее, чем команды пересылки. Команды очистки иногда относят к группе логических команд, но суть их от этого не меняется.
Команды инкремента (увеличения на единицу, INC) и декремента (уменьшения на единицу, DEC) также бывают очень удобны. Их можно в принципе заменить командами суммирования с единицей или вычитания единицы, но инкремент и декремент выполняются быстрее, чем суммирование и вычитание. Эти команды требуют одного входного операнда, который одновременно является и выходным операндом.
Наконец, команда сравнения (обозначается CMP) предназначена для сравнения двух входных операндов. По сути, она вычисляет разность этих двух операндов, но выходного операнда не формирует, а всего лишь изменяет биты в регистре состояния процессора (PSW) по результату этого вычитания. Следующая за командой сравнения команда (обычно это команда перехода) будет анализировать биты в регистре состояния процессора и выполнять действия в зависимости от их значений (о командах перехода речь идет в разделе 3.3.4). В некоторых процессорах предусмотрены команды цепочечного сравнения двух последовательностей операндов, находящихся в памяти (например, в процессоре 8086 и совместимых с ним).
Логические команды выполняют над операндами логические (побитовые) операции, то есть они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Логические команды выполняют следующие основные операции:
· логическое И, логическое ИЛИ, сложение по модулю 2 (Исключающее ИЛИ);
· логические, арифметические и циклические сдвиги;
· проверка битов и операндов;
· установка и очистка битов (флагов) регистра состояния процессора (PSW).
Команды логических операций позволяют побитно вычислять основные логические функции от двух входных операндов. Кроме того, операция И (AND) используется для принудительной очистки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие очистки, установлены в нуль). Операция ИЛИ (OR) применяется для принудительной установки заданных битов (в качестве одного из операндов при этом используется код маски, в котором разряды, требующие установки в единицу, равны единице). Операция «Исключающее ИЛИ» (XOR) используется для инверсии заданных битов (в качестве одного из операндов при этом применяется код маски, в котором биты, подлежащие инверсии, установлены в единицу). Команды требуют двух входных операндов и формируют один выходной операнд.
Команды сдвигов позволяют побитно сдвигать код операнда вправо (в сторону младших разрядов) или влево (в сторону старших разрядов). Тип сдвига (логический, арифметический или циклический) определяет, каково будет новое значение старшего бита (при сдвиге вправо) или младшего бита (при сдвиге влево), а также определяет, будет ли где-то сохранено прежнее значение старшего бита (при сдвиге влево) или младшего бита (при сдвиге вправо). Например, при логическом сдвиге вправо в старшем разряде кода операнда устанавливается нуль, а младший разряд записывается в качестве флага переноса в регистр состояния процессора. А при арифметическом сдвиге вправо значение старшего разряда сохраняется прежним (нулем или единицей), младший разряд также записывается в качестве флага переноса.
Циклические сдвиги позволяют сдвигать биты кода операнда по кругу (по часовой стрелке при сдвиге вправо или против часовой стрелки при сдвиге влево). При этом в кольцо сдвига может входить или не входить флаг переноса. В бит флага переноса (если он используется) записывается значение старшего бита при циклическом сдвиге влево и младшего бита при циклическом сдвиге вправо. Соответственно, значение бита флага переноса будет переписываться в младший разряд при циклическом сдвиге влево и в старший разряд при циклическом сдвиге вправо.
Команды проверки битов и операндов предназначены для установки или очистки битов регистра состояния процессора в зависимости от значения выбранных битов или всего операнда в целом. Выходного операнда команды не формируют. Команда проверки операнда (TST) проверяет весь код операнда в целом на равенство нулю и на знак (на значение старшего бита), она требует только одного входного операнда. Команда проверки бита (BIT) проверяет только отдельные биты, для выбора которых в качестве второго операнда используется код маски. В коде маски проверяемым битам основного операнда должны соответствовать единичные разряды.
Наконец, команды установки и очистки битов регистра состояния процессора (то есть флагов) позволяют установить или очистить любой флаг, что бывает очень удобно. Каждому флагу обычно соответствуют две команды, одна из которых устанавливает его в единицу, а другая сбрасывает в нуль. Например, флагу переноса C (от Carry) будут соответствовать команды CLC (очистка) и SEC или STC (установка).
Команды переходов предназначены для организации всевозможных циклов, ветвлений, вызовов подпрограмм и т.д., то есть они нарушают последовательный ход выполнения программы. Эти команды записывают в регистр-счетчик команд новое значение и тем самым вызывают переход процессора не к следующей по порядку команде, а к любой другой команде в памяти программ. Некоторые команды переходов предусматривают в дальнейшем возврат назад, в точку, из которой был сделан переход, другие не предусматривают этого. Если возврат предусмотрен, то текущие параметры процессора сохраняются в стеке. Если возврат не предусмотрен, то текущие параметры процессора не сохраняются.
Команды переходов без возврата делятся на две группы:
· команды безусловных переходов;
· команды условных переходов.
В обозначениях этих команд используются слова Branch (ветвление) и Jump (прыжок).
Команды безусловных переходов вызывают переход в новый адрес независимо ни от чего. Они могут вызывать переход на указанную величину смещения (вперед или назад) или же на указанный адрес памяти. Величина смещения или новое значение адреса указываются в качестве входного операнда.
Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора (PSW). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Всего таких условий перехода может быть от 4 до 16. Несколько примеров команд условных переходов:
· переход, если равно нулю;
· переход, если не равно нулю;
· переход, если есть переполнение;
· переход, если нет переполнения;
· переход, если больше нуля;
· переход, если меньше или равно нулю.
Если условие перехода выполняется, то производится загрузка в регистр-счетчик команд нового значения. Если же условие перехода не выполняется, счетчик команд просто наращивается, и процессор выбирает и выполняет следующую по порядку команду.
Регистры процессора, как сверхбыстродействующая память, предназначены для хранения операндов и команд, сведений о состоянии вычислительного процесса, обмена данными между МП, ОЗУ и портами, организации адресации и взаимодействия между блоками. По выполняемым функциям они подразделяются на пользовательские, системные и регистры сопроцессора. В 16 регистров пользователя (прикладного программиста) включены 8 регистров общего назначения, 6 сегментных регистров, регистр (счетчик) команд и регистр флагов. Определенные буквы в наименованиях регистров несут смысловое значение:
- E (Extended) – расширенный, т.е. 32-битный;
- H (High) – старший байт регистра, разряды ;
- L (Low) – младший байт, разряды .
Описание регистров общего назначения:
- EAX/AX/AL – аккумулятор, регистр для операций ввода/вывода через порты, вместе с DX выступают в качестве неявных операндов в командах умножения и деления; AL – регистр двоично-десятичных операций;
- EBX/BX – регистр для хранения базовых адресов при работе с данными;
- ECX/CX/CL – счетчик, используется при организации циклов;
- EDX/DX/DL – регистр данных, хранит данные по умолчанию, адрес порта при операциях ввода/вывода, используется в командах умножения и деления;
- EBP/BP – указатель базы при работе с данными в стековых структурах;
- ESP/SP – указатель (реверсивный счетчик) стека;
- ESI/SI – адресный регистр – индекс источника;
- EDI/DI – адресный регистр – индекс приемника. Вместе с SI используется в цепочечных инструкциях обработки массивов, хранит смещения (индексы) относительно базы (начала массива).
Сегментные регистры CS, SS, DS, ES, FS, GS используются для сегментной адресации. Регистры FS и GS появились в составе МП, начиная с i386.
Регистр-указатель команд EIP/IP предназначен для определения адреса следующей команды.
По назначению регистры различаются на:
· аккумулятор — используется для хранения промежуточных результатов арифметических и логических операций и инструкций ввода-вывода;
· флаговые — хранят признаки результатов арифметических и логических операций;
· общего назначения — хранят операнды арифметических и логических выражений, индексы и адреса;
· индексные — хранят индексы исходных и целевых элементов массива;
· указательные — хранят указатели на специальные области памяти (указатель текущей операции, указатель базы, указатель стека);
· сегментные — хранят адреса и селекторы сегментов памяти;
· управляющие — хранят информацию, управляющую состоянием процессора, а также адреса системных таблиц.
Параллельные вычисления — способ организации компьютерных вычислений , при котором программы разрабатываются как набор взаимодействующих вычислительных процессов, работающих параллельно (одновременно). Термин охватывает совокупность вопросов параллелизма в программировании , а также создание эффективно действующих аппаратных реализаций . Теория параллельных вычислений составляет раздел прикладной теории алгоритмов .
Существуют различные способы реализации параллельных вычислений. Например, каждый вычислительный процесс может быть реализован в виде процесса операционной системы , либо же вычислительные процессы могут представлять собой набор потоков выполнения внутри одного процесса ОС. Параллельные программы могут физически исполняться либо последовательно на единственном процессоре — перемежая по очереди шаги выполнения каждого вычислительного процесса, либо параллельно — выделяя каждому вычислительному процессу один или несколько процессоров (находящихся рядом или распределённых в компьютерную сеть ).
Основная сложность при проектировании параллельных программ — обеспечить правильную последовательность взаимодействий между различными вычислительными процессами, а также координацию ресурсов, разделяемых между процессами.
Один из самых простых и наиболее распространенных способов повышения быстродействия процессоров — конвейеризация процесса вычислений. Большое преимущество конвейерных ЭВМ перед параллельными других типов — возможность использования пакетов программ, уже написанных для последовательных ЭВМ.
Под конвейерным режимом понимают такой вид обработки, при котором интервал времени, требуемый для выполнения процесса в функциональном узле (например, в АЛУ) микропроцессора, продолжительнее, чем интервалы, через которые данные могут вводиться в этот узел. Предполагается, что функциональный узел выполняет процесс в несколько этапов, т. е. когда первый этап завершается, результаты передаются на второй этап, на котором используются другие аппаратные средства. Разумеется, что устройство, используемое на первом этапе, оказывается свободным для начала новой обработки данных. Как известно, можно выделить четыре этапа обработки команды микропроцессора: выборка, декодирование, выполнение и запись результата. Иными словами, в ряде случаев, пока первая команда выполняется, вторая может декодироваться, а третья выбираться.
В любом процессоре машинная команда проходит ряд этапов обработки, например: выборку команды из оперативной памяти (ВК), вычисление абсолютного адреса операнда в оперативной памяти (ВА), выборку операнда из памяти (ВО), операцию в АЛУ.
В процессоре последовательной ЭВМ для осуществления этих функций используется единственное устройство, поэтому время выполнения команды равно:
Чс = ^ВК + ^ВА + ^ВО + *АЛУ
Для того чтобы уменьшить /к, можно для каждой функции ввести собственное оборудование. В таком процессоре любая команда последовательно проходит через все устройства, находясь на каждом этапе время А. Конвейерные процессоры применяются во всех без исключения старших моделях семейств ПЭВМ.
Производительность является одной из наиболее важных характеристик процессора. Согласно /1/, в общем случае она определяется количеством вычислительной работы, выполняемой в единицу времени. К важнейшим факторам, влияющим на производительность, относятся тактовая частота, число команд программы, среднее время выполнения отдельной команды. Для упрощённой оценки производительности процессора часто используют показатель, указывающий число команд, выполняемых за секунду КС (команд за секунду). КС определяется как частное от деления тактовой частоты на среднее время выполнения процессором отдельной команды и измеряется в MIPS (Meg Insruction Per Second) для целочисленных задач и MFLOPS (Meg Floating Point Operations Per Second) для вычислений с плавающей точкой. При этом оценки показателя КС проводят для операций с регистровыми операндами, не привязываясь к быстродействию основной памяти. Однако показатель КС не учитывает особенности архитектуры конкретных процессоров. Поэтому для сравнительных характеристик различных процессоров используются относительные оценки производительности, для получения которых используются специальные тестовые программы.
В соответствии с /1/, повышение производительности процессоров в большинстве случаев достигается за счёт применения специальных технологических и архитектурных решений. Технологические подходы (совершенствование технологий производства ИС, увеличение степени интеграции) были рассмотрены ранее, во второй лекции. Поэтому подробнее остановимся на архитектурных способах повышения производительности процессоров. Совершенствование архитектуры процессоров, обеспечивающее повышение его производительности, в настоящее время связано, прежде всего, с развитием средств параллельной обработки данных. Здесь можно выделить следующие направления:
1) Увеличение «естественного» параллелизма – повышение разрядности обработки и передачи данных (разрядность процессоров повысилась с 4 до 32 и 64 разрядов).
2) Конвейерная (многофазная) обработка данных – вычислительный процесс делится на несколько фаз, для каждой из которых используются свои средства и буфер для хранения результата (ступень конвейера).
3) Многоэлементная обработка данных - параллельная обработка данных в нескольких операционных блоках (ОУ) процессора.
Способы параллельной обработки могут сочетаться. Например, в одном процессоре можно организовать несколько операционных блоков, в каждом из которых использовать конвейеризацию.
Рассмотрим более детально два последних направления.
При многофазной обработке, как показано на рисунке 4.3, процесс обработки данных разбивается на несколько стадий (фаз), выполняемых последовательно.
Рисунок 4.3 – Многофазная обработка данных
Между фазами имеются буферы для хранения промежуточных результатов. После выполнения первой фазы результат запоминается в буфере и начинается обработка второй фазы. Средства выполнения первой фазы освобождаются, и на них поступает следующая порция данных. Если длительность фаз обработки одинакова и составляет T/n, то при таком способе производительность системы увеличится в n раз. Этот способ соответствует конвейерной обработке.
Рассмотрим организацию конвейера на уровне исполнения машинной команды /1/. Каждый блок в конвейерной цепочке осуществляет только один этап исполнения команды. Полная обработка команды занимает несколько тактов.
Типовые этапы выполнения команды: 1) выборка команды IF (Instruction Fetch), 2) дешифрация команды ID (Instruction Decode), 3) чтение операндов RD (Read Memory), 4) исполнение заданной в команде операции EX (Execute), 5) запись результата WB (Write Back). В ходе выполнения команда продвигается по конвейеру, освобождая очередную ступень для следующей команды. Содержимое буферов, которые используются для хранения информации, передаваемой по ступеням конвейера, обновляется в каждом такте по завершению этапа исполнения очередной команды. Промежуточные буферы обеспечивают параллельную независимую работу блоков конвейерной цепочки: в то время, когда последующий блок начинает выполнять этап очередной команды, предыдущий блок может приступать к обработке следующей команды, что демонстрирует рисунок 4.4.
Такты работы процессора | |||||
Команда i | IF | ID | RD | EX | WB |
Команда i+1 | IF | ID | RD | EX | WB |
Команда i+2 | IF | ID | RD | EX | WB |
Команда i+3 | IF | ID | RD | EX | WB |
Команда i+4 | IF | ID | RD | EX | WB |
Команда i+5 | IF | ID | RD | EX | WB |
Рисунок 4.4 – Конвейерная обработка команд
Следует отметить, что конвейерная обработка команд не уменьшает время выполнения отдельной команды, которое в конвейерном процессоре остаётся таким же, как и в обычном неконвейерном. Однако благодаря тому, что при конвейерной обработке большая часть вычислительного процесса в режиме одновременного выполнения команд, скорость выдачи результатов последовательно выполняемых команд увеличивается пропорционально числу ступеней конвейера. Продолжительность выполнения отдельных этапов исполнения команды в общем случае зависит от типа команды и места размещения операндов. Конвейерная обработка команд наиболее эффективна в том случае, если длительность всех фаз выполнения команды приблизительно одинаковая. К сожалению, обеспечить непрерывную работу конвейера не всегда удаётся из-за различных конфликтов: по ресурсам, по данным, по управлению. Более подробно о конфликтах – в /1/.
Процессор, в котором процесс выполнения команды разбивается на 5-6 ступеней, называется обычным конвейерным процессором. Если увеличить количество ступеней конвейера, то каждая отдельная ступень будет выполнять меньшую работу, а, следовательно, содержать меньше аппаратной логики. Благодаря более коротким задержкам распространения сигналов в каждой отдельно взятой ступени конвейера достигается повышение частоты работы и соответствующее повышение производительности процессора. Процессор, имеющий конвейер существенно глубже 5-6 ступеней, называется суперконвейерным. Например, Pentium II содержит 12 ступеней, UltraSPARC III – 14 ступеней, Pentium 4 – 20 ступеней.
Как показано на рисунке 4.5 /1/, многоэлементная обработка осуществляется на нескольких параллельно работающих ОУ. Каждый элемент выполняет свою работу, осуществляя обработку порции данных от начала до конца.
Рисунок 4.5 – Многоэлементная параллельная обработка данных
Если время выполнения работы на отдельном элементе составляет T и в системе используется n элементов, то при определённой идеализации можно ожидать, что среднее время выполнения такой работы составит T/n (реально - меньше). В современных процессорах такой способ обработки связан с понятием суперскалярной архитектуры.
Простейшим примером вычислительного параллелизма является выполнение двух команд, операнды которых не связаны между собой:
A = B + C; D = E + F.
Поэтому обе команды можно выполнять одновременно. Для выполнения несвязанных операций в состав процессора включают набор арифметических устройств, каждое из которых обычно имеет конвейерную организацию.
Процессор, содержащий несколько ОУ, которые обеспечивает одновременное выполнение более одной скалярной команды, называется суперскалярным процессором. Команда называется скалярной, если её входные операнды и результат являются числами (скалярами). Традиционные процессоры с одним ОУ называются скалярными. В суперскалярном процессоре обработка команд распараллелена не только во времени (конвейер), но и в пространстве (несколько конвейеров). Производительность такого процессора оценивается темпом схода исполненных команд со всех его конвейеров.
В настоящее время используются два способа суперскалярной обработки. Первый способ базируется на чисто аппаратном механизме выборки несвязанных команд программы из памяти (кэш-памяти, буфера предвыборки) и параллельном запуске их на исполнение. Ответственность за эффективность загрузки параллельно функционирующих конвейеров возлагается на аппаратные средства процессора, что является основным достоинством этого способа суперскалярной обработки. В этом случае процесс трансляции программ для суперскалярного процессора ничем не отличается от трансляции программ для традиционного скалярного процессора. В соответствии с этим способом, сравнительно легко реализуются суперскалярные микропроцессоры различных семейств программно совместимые между собой. При этом не возникает проблем с использованием ранее созданного программного обеспечения. Все процессоры семейства Pentium реализованы по этому способу.
В процессорах, реализующих второй способ суперскалярной обработки, планирование параллельного исполнения нескольких команд возлагается на распараллеливающий компилятор. Сначала он анализирует исходную программу в целях выявления команд, которые могут выполняться одновременно. Затем компилятор группирует такие команды в пакеты команд – длинные командные слова (VLIW), причём, число простых команд в команде VLIW принимается равным числу исполнительных блоков процессора. Поскольку всю работу по подготовке к исполнению VLIW-команд выполняет компилятор, конфликтные ситуации при их исполнении исключаются. Такой способ суперскалярной обработки реализуется в VLIW-процессорах, имеющих статическую сперскалярную архитектуру. К сожалению, для таких процессоров требуется специальное программное обеспечение. Кроме того, программы, скомпилированные для одного поколения микропроцессоров, могут выполняться неэффективно без перекомпиляции на процессорах следующего поколения. Это требует от разработчиков программного обеспечения разработки модифицированных версий исполняемых файлов своего продукта для разных поколений процессоров. Идеи VLIW предложены российскими инженерами и учёными во главе с профессором Б.А. Бабаяном при разработке отечественной супер-ЭВМ «Эльбрус-3» (1990). В настоящее время VLIW-технология реализована в процессоре Эльбрус Е2К отечественной компании «Эльбрус Интернешнл», процессорах Crusoe фирмы Transmeta, а также в семействе сигнальных процессоров (для цифровой обработки сигналов) TMS320C60xx фирмы Texas Instruments.
Далее рассмотрим вопросы, посвящённые организации работы процессоров и их взаимодействия с другими устройствами вы числительных машин.
Рассмотрим процесс выполнения процессором команды для коротких (с фиксированной запятой или логические) операций. Как об этом говорилось выше, обработка команды, или цикл процессора, может быть разделена на несколько основных этапов, которые можно назвать микрокомандами, которых известно пять основных типов.
Каждая операция требует для своего выполнения времени, равного такту генератора процессора ( tick of the internal clock). Отметим, что к длинным операциям (плавающая точка) это не имеет отношения — там другая арифметика. Очевидно, что при тактовой частоте в 100 МГц быстродействие составит 20 миллионов операций в секунду.
Все этапы команды задействуются только один раз и всегда в одном и том же порядке: одна за другой. Это, в частности, означает, что если первая микрокоманда выполнила свою работу и передала результаты второй, то для выполнения текущей команды она больше не понадобится, и, следовательно, может приступить к выполнению следующей команды.
Конвейеризация осуществляет многопоточную параллельную обработку команд, так что в каждый момент одна из команд считывает-ся, другая декодируется и т. д., и всего в обработке одновременно находится пять команд. Таким образом, на выходе конвейера на каждом такте процессора появляется результат обработки одной команды (одна команда в один такт). Первая инструкция может считаться выполненной, когда завершат работу все пять микрокоманд.
Такая технология обработки команд носит название конвейерной ( pipeline) обработки. Каждая часть устройства называется ступенью конвейера, а общее число ступеней — длиной линии конвейера.
С ростом числа линий конвейера и увеличением числа ступеней на линии (табл. ) увеличивается пропускная способность процессора при неизменной тактовой частоте. Процессоры с несколькими линиями конвейера получили название суперскалярных. Pentium — первый суперскалярный процессор Intel. Здесь две линии, что позволяет ему при одинаковых частотах быть вдвое производительней i80486, выполняя сразу две инструкции за такт.
Во многих вычислительных системах, наряду с конвейером команд, используются конвейеры данных.
Сочетание этих двух конвейеров дает возможность достичь очень высокой производительности на определенных классах задач, особенно если используется несколько различных конвейерных процессоров, способных работать одновременно и независимо друг от друга.
Одной из наиболее высокопроизводительных вычислительных конвейерных систем считается CRAY. В этой системе конвейерный принцип обработки используется в максимальной степени. Имеется как конвейер команд, так и конвейер арифметических и логических операций. В системе широко применяется совмещенная обработка информации несколькими устройствами. Максимальная пиковая производительность процессора может составлять 12 Гфлопс.
Матричные и векторные процессоры
В отличие от скалярных и даже суперскалярных процессоров данные устройства манипулируют массивами данных и предназначены для обработки изображений, матриц и массивов данных. Частным случаем векторного процессора является процессор изображений, который предназначен для обработки сигналов, поступающих
от датчиков-формирователей изображения.
Матричный процессор имеет архитектуру, рассчитанную на обработку числовых массивов. Архитектура процессора включает в себя матрицу процессорных элементов, например 64 х 64, работающих одновременно. Постпроцессор предназначен для реализации некоторых специальных функций, например управления базой данных.
Векторный процессор обеспечивает параллельное выполнение операции над массивами данных, векторами. Он характеризуется
специальной архитектурой, построенной на группе параллельно работающих процессорных элементов (рис ).
Векторная обработка увеличивает производительность процессора за счет того, что обработка целого набора данных (вектора)
производится одной командой. Векторные компьютеры манипулируют массивами сходных данных подобно тому, как скалярные машины обрабатывают отдельные элементы таких массивов. В этом случае каждый элемент вектора надо рассматривать как отдельный
элемент потока данных. При работе в векторном режиме векторные процессоры обрабатывают данные практически параллельно, что делает их в несколько раз более быстрыми, чем при работе в скалярном режиме. Максимальная скорость передачи данных в векторном формате может составлять 64 Гбайт/с, что на два порядка быстрее, чем в скалярных машинах.
В настоящее время созданы однокристальные векторно-конвей-ерные процессоры, такие, как SX-6. Основными компонентами микропроцессора являются скалярный процессор и восемь идентичных векторных устройств, суммарная производительность которых составляет 64 Гфлопс. Примерами систем подобного типа являются, например, процессоры фирм NEC и Hitachi. Динамическое исполнение (Dynamic execution technology)
Это совокупность технологий обработки данных в процессоре,
обеспечивающая более эффективную работу процессора за счет манипулирования данными, а не простого исполнения списка инструкций.
Динамическое исполнение представляет собой-комбинацию трех методов обработки данных:
множественное предсказание ветвлений;
анализ потока данных;
спекулятивное (по предположению) исполнение. Впервые реализовано в процессоре Pentium Pro.
Множественное предсказание ветвлений. Предсказывается прохождение программы по нескольким ветвям: процессор может предвидеть разделение потока инструкций, используя алгоритм множественного предсказания ветвлений. С большой точностью (более 90 %) он предсказывает, в какой области памяти можно найти следующие инструкции. Это оказывается возможным, поскольку в процессе исполнения иструкции процессор просматривает программу на несколько шагов вперед. Этот метод позволяет увеличить загруженность процессора.
Хотя ВТВ ( Branch Target Buffer — буфер предсказания переходов) и не может правильно предсказать абсолютно все переходы, но
большинство предсказаний оказывается точными, что обеспечивает
значительное повышение производительности. Например, программный цикл, состоящий из пересылки, сравнения, сложения и перехода в 80486 DX выполняется за 6 тактов синхронизации, а в Pentium за 2 ( команды пересылки и сложения, а также сравнения и перехода сочетаются и предсказывается переход).
Анализ потока данных. Анализирует и составляет график исполнения инструкций в оптимальной последовательности,
независимо от порядка их следования в тексте программы. Используя анализ потока данных, процессор просматривает декодированные инструкции и определяет, готовы ли они к непосредственному исполнению или зависят от результата других инструкций. Далее процессор определяет оптимальную последовательность выполнения и исполняет инструкции наиболее эффективным образом.
Спекулятивное выполнение. Повышает скорость выполнения, просматривая программу вперед и исполняя те инструкции, которые необходимы. Процессор выполняет инструкции (до пяти инструкций одновременно) по мере их поступления в оптимизированной последовательности (спекулятивно). Поскольку выполнение инструкций происходит на основе предсказания ветвлений, результаты сохраняются как « спекулятивные ». На конечном этапе порядок инструкций восстанавливается и переводится в обычное машинное состояние.
Процессоры уровня IA-64 имеют мощные вычислительные ресурсы, включая 128 регистров целых чисел, 128 регистров действительных чисел, 64 предиксщионных регистра, а также ряд специальных регистров.
Набор команд оптимизирован для решения задач криптографии, обработки видеосигналов и других процессов, встречающихся в серверах и рабочих станциях.
Представлены иллюстрации к возможностям архитектуры IA-64:
· предикация ( predication) — одновременное исполнение двух ветвей программы, вместо предсказания переходов (выполнения наиболее вероятного);
· опережающее чтение данных ( speculative loading), т. е. загрузка данных в регистры с опережением, до того, как определилось реальное ветвление программы (переход управления). Эти возможности осуществляются комбинированно — при компиляции и выполнении программы.
Предикация — центральный метод планирования параллельной обработки. Компилятор транслирует операторы исходного кода, содержащие ветвление (условный переход), в совокупность блоковмашинных команд, идущих друг за другом. Обычный процессор, в зависимости от исхода условия, исполняет один из этих базовых блоков, пропуская все другие. Более развитые процессоры пытаются прогнозировать исход операции перехода и заранее (спекулятивно, по предположению) выполняют один из блоков, теряя время при ошибке прогнозирования.
Базовые блоки обычно малы ( 2 -3 команды) и ветвление встречается в среднем через каждые шесть операторов языка программирования. Поэтому выигрыш оказывается небольшим.
Когда компилятор уровня IA-64 обнаруживает оператор ветвления в исходной программе, он анализирует все возможные ветви (блоки) и помечает их метками или предикатами ( predicate). После этого он определяет, какие из них могут быть выполнены параллельно (из соседних, независимых, ветвей).
Технология Hyper-Threading (HT)
Здесь реализуется разделение времени на аппаратном уровне физически процессор разбивается на два логических процессора, каждый из которых использует ресурсы чипа — ядро, кэш-память, шины, исполнительное устройство Ядро процессора выполняет два процесса одновременно эффективности в 30 % при использовании на НТ-процессорах многопрограммных ОС и обычных прикладных программ
Что же представляют собой современные процессоры, в которых реализованы все эти « штучки », воочию 9 Рассмотрим рис 2 13 Процессор Pentium состоит из исполнительное устройство Производительность МП при тактовой частоте 66 МГц составляет около 112 млн инструкций в секунду ( Mips ) Пятикратное повышение (по сравнению с 80486 DX ) достигалось благодаря двум конвейерам, позволяющим выполнить одновременно несколько инструкций Это два параллельных 5- ступенчатых конвейера обработки целых чисел, которые позволяют читать, интерпретировать, исполнять две команды одновременно такт синхронизации Эти конвейеры неодинаковы U- конвейер выполняет любую команду системы команд семейства 86, V- конвейер выполняет только « простые » команды, т е команды, которые полностью встроены в схемы МП и не требуют микропрограммного управления ( microcode) при выполнении (это команды, допускающие спаривание с другими командами
регистр-память, переходы, вызовы, арифметико-логические операции)
Предсказатель переходов ( Branch Predictor) Пытается угадать направление ветвления программы и заранее загрузить информацию в блоки предвыборки и декодирования команд
Буфер адреса переходов ( Branch Target Buffer, BTB) Обеспечивает динамическое предсказание переходов Он улучшает выполнение команд путем запоминания состоявшихся переходов ( 256 последних переходов) и с опережением выполняет наиболее вероятный переход при выборке команды ветвления. Если предсказание верно, то эффективность увеличивается. Если нет, то конвейер приходится сбрасывать полностью. Согласно данным Intel, вероятность правильного предсказания переходов в процессорах Pentium, Pentium ММХ составляет 75-80 %, а для Pentium Pro, Pentium II - 90 %.
Статические методы предсказания упрощены — они предписывают всегда выполнять или нет определенные виды переходов. При динамических методах исследуется поведение команд перехода за
Блок плавающей точки ( Floating Point Unit). Выполняет обработку
чисел с плавающей точкой.
Кэш-память 1- го уровня ( Level 1 cache, L1). Процессор имеет два банка памяти по 8 Кбайт: 1- й — для команд, 2- й — для данных, которые обладают большим быстродействием, чем более емкая внешняя кэш-память ( L2 cache).
Интерфейс шины ( Bus Interface). Передает в ЦП поток команд и данных, а также передает данные из ЦП.
Результаты тестов SPECcpu2006 подталкивают к выводу, что самые высокопроизводительные на сегодняшний день ядра микропроцессоров имеют микроархитектуру Sandy Bridge с векторным расширением AVX.
Результаты тестов SPECcpu2006 подталкивают к выводу, что самые высокопроизводительные на сегодняшний день ядра микропроцессоров имеют микроархитектуру Intel Sandy Bridge с векторным расширением AVX.
Современные технологии автоматического распараллеливания позволяют поднимать производительность работы последовательных кодов, и теперь иногда трудно понять — быстрее ли работают появившиеся на рынке процессорные ядра или высокое быстродействие было достигнуто за счет увеличения их числа. В этом смысле, после разрешения применять в тестах автоматическое распараллеливание компиляторами, тесты SPECcpu2006 (табл. 1) перестали быть точной метрикой производительности процессоров при выполнении последовательных программ, с которыми сегодня работает подавляющее большинство пользователей. При этом стало труднее сравнить даже производительность процессоров, поскольку однопроцессорные результаты для серверов уже приводятся не всегда. Например, в случае с Intel Xeon E3 на базе Sandy Bridge сегодня возможны только однопроцессорные версии, а для их конкурентов обычно приводятся лучшие данные для двух и более процессорных систем.
Таблица 1. Производительность м микропроцессоров |
Для 16-ядерных процессоров Opteron 6200 с микроархитектурой Bulldozer, поддерживающей расширение AVX (Advanced Vector Extensions), официальные данные по SPECint2006/SPECfp2006 вообще отсутствуют, представлены лишь данные по SPECint_rate2006/SPECfp_rate2006. По первому показателю один процессор Xeon Е3-1280 опережает два процессора Opteron 6204 (cамая высокочастотная модель с четырьмя ядрами — 3,3 ГГц, в турборежиме — 4,2 ГГц). По показателю SPECfp_rate2006 компьютер с двумя Opteron 6204 и с вдвое большим числом ядер быстрее однопроцессорного E3-1280 в 1,3 раза. Учитывая, что данные rate-тестов почти линейно масштабируются с числом процессоров, можно предположить, что ядра Bulldozer сегодня отстают по производительности от доступных Xeon E3. Имеется отрыв по производительности одиночных ядер и процессоров Xeon E3 относительно Opteron предыдущего поколения. По базовому значению SPECfp2006, как и по SPECint2006, Xeon сильно впереди относительно Power7. Лишь на SPECfp2006 процессоры Power7/3,86 ГГц опережают по пиковому значению E3-1280.
Возможно, на результаты SPECfp_peak2006 сказалось и автораспараллеливание у IBM на 16 ядрах (два процессора) против четырех ядер (один процессор) у Intel. Кроме того, результаты Intel могут быть выше на E3-1290 c более высокой, чем у 1280, тактовой частотой (3,6–4 ГГц при использовании Turbo Boost), не говоря уже об ожидаемых многопроцессорных вариантах Xeon/Sandy Bridge. Но если брать пиковую производительность с плавающей запятой, то Power7 окажется впереди — его максимальная тактовая частота, 4,14 ГГц, чуть выше, чем у E3-1290 (4 ГГц): оба процессора способны выдавать восемь результатов двойной точности за такт. Важно учитывать также отношения стоимость/производительность и, особенно для HPC-приложений, «плотность упаковки», связанную с числом ядер в процессорах (она очень высока в Opteron 6200), а также тепловыделение.
Расширение AVX
Главным новшеством в Sandy Bridge, возможно, следует признать архитектурное расширение системы команд AVX [ 2 ]. AVX вводит 256-разрядные векторы и SIMD-регистры cоответствующей длины; новый трехоперандный синтаксис с новым префиксом VEX (вероятно, от Vector Extensions) для кодирования команд и расширения FMA (fused multiply-add, то есть команды типа «умножить-и-сложить», «умножить-и-вычесть» и др.) повышенной точности в соответствии со стандартом IEEE754/2008.
256-разрядные регистры YMM0-YMM15 в своих нижних 128 разрядах «эквивалентны» регистрам XMM. Вместе с VEX вводится также большое число новых команд с функциональностью, совпадающей с имеющимися ранее, но кодируемых с помощью VEX. Кроме того, в AVX представлены новые команды с новой функциональностью: загрузки 256-разрядных векторных регистров и пересылки между ними, команды работы с отдельными битами, расширенная команда умножения MULX для «длинных» целых чисел и др.
Поддержки 256-разрядной FMA в Sandy Bridge пока нет, вероятно, она появится в следующем поколении Ivy Bridge с типоразмером 22 нм. Там же ожидается поддержка расширения AVX2, которое включает работу с 256-разрядными целочисленными данными. Одновременно с поддержкой FMA возрастет и количество получаемых за такт результатов с плавающей запятой.
Микроархитектура
Приведенный здесь анализ представляет интерес не только для ознакомления с аппаратными средствами, но и для программистов, в первую очередь на ассемблере. Микроархитектура ядра Sandy Bridge (см. рисунок) была значительно усовершенствована по сравнению с Nehalem [ 1 ], причем наиболее существенным улучшением стало увеличение числа исполнительных устройств (EU) c плавающей запятой. Это привело к тому, что за каждый такт выдается вдвое больше результатов с плавающей запятой (с двойной точностью — восемь). Важным также является поддержка 256-разрядного расширения AVX.
Общая блок-схема конвейера Sandy Bridge |
Во фронтальной части конвейера (обозначим ее как FE) последовательно выбираются команды и декодируются в микрооперации (MOP), обеспечивая их потоком последующие стадии обработки. Соответствующие им блоки микропроцессоров все вместе иногда именуют «исполнительным движком» (Execution Engine, EE). В Sandy Bridge — это суперскалярный (до шести МОР за такт) блок, обеспечивающий внеочередное выполнение МОР. Движок фактически реализует архитектуру потока данных (dataflow) — МОР начинают выполняться, как только становятся готовы исходные операнды и исполнительные ресурсы.
Последние стадии конвейера (после выполнения МОР) реализуются с применением устройства «завершения» (RU, retirement unit), в котором осуществляется обработка исключительных ситуаций выполнения, а результаты делаются «видимыми» в порядке, определяемом исходным кодом программы.
Проведенные в Sandy Bridge усовершенствования в иерархии TLB повышают производительность, в первую очередь для приложений с большим рабочим множеством страниц. I-TLB в Sandy Bridge имеет емкость 128 строк для страниц емкостью 4 Кбайт (как в Nehalem) и восемь строк (против семи в Nehalem) для страниц по 2/4 Мбайт. Емкость D-TLB для страниц размером 4 Кбайт и 2/4 Мбайт составляет 64 и 32 cоответственно; кроме того, D-TLB поддерживает теперь страницы по 1 Гбайт (четыре строки). Буфер D-TLB обеспечивает три преобразования линейного адреса в физический за такт (два для адресов загрузки и одно для адресов записи), что отвечает возможностям одновременного выполнения Sandy Bridge трех соответствующих команд. При промахе в I-TLB или D-TLB обращение идет в общий для команд и данных TLB второго уровня, STLB, емкостью 512 строк для страниц в 4 Кбайт. При промахе в I-TLB/D-TLB и попадании в STLB задержка равна семи тактам.
В FE устройство предсказания переходов (назовем его BPU) указывает на блок кодов программы, который выбирается из кэша декодированных команд (Decoded I-cache, DI-кэш), из I-кэша, из кэшей L2, L3 или из оперативной памяти. При выборке из I-кэша используются традиционные для Intel четыре декодера СISC-команд в МОР, первый из которых декодирует команды, порождающие до четырех МОР, а оставшиеся — по одной МОР. Более сложные CISC-команды используют последовательности МОР, хранящиеся в ROM-кэше.
Декодеры направляют MOP в очередь (MOP туда могут попадать и прямо из DI-кэша) и в DI-кэш. В очереди реализован также детектор циклов (Loop Stream Detector), распознающий циклы длиной не более 28 МОР, целиком размещающиеся в очереди. При обнаружении такого цикла его тело «закрепляется» в очереди МОР. Однако раскрутка (unrolling) циклов обычно более предпочтительна для повышения производительности.
Все декодеры поддерживают микро- и макро-«объединение» (fusion). При микрообъединении несколько МОР одной команды объединяются в одну сложную МОР, что типично для операций работы с памятью. При макрообъединении две команды сливаются в одну МОР. Первая команда из пары устанавливает флаги (например, сравнение), а вторая — условный переход. Микро- и макрообъединение увеличивает, в частности, пропускную способность конвейера.
Применение DI-кэша более эффективно по сравнению с применением обычных стадий декодирования. Благодаря DI-кэшу растет скорость доставки МОР к исполнительным блокам и уменьшается задержка при неправильном предсказании перехода. Емкость DI-кэша составляет 1536 МОР.
EE реализует финальные стадии конвейера и включает устройства переименования регистров/распределения ресурсов, устройство завершения (RU) и планировщик с исполнительными устройствами (EU). Блок EE, по сравнению с Nehalem, был усовершенствован для повышения среднего числа выполняемых за такт команд. Так, с 36 до 54 возросло число строк в планировщике, выросло также число буферов для операций загрузки регистров/записи и др.
Блок переименования регистров убирает ложные взаимозависимости между МОР, обеспечивая возможности их внеочередного выполнения. Этот блок за такт выбирает до четырех МОР (включая объединенные) из очереди МОР. Исходные архитектурные регистры и регистры результата здесь переименовываются во внутренние микроархитектурные, распределяются ресурсы (например, буферы загрузки/записи), определяются нужные порты диспетчеризации МОР. Здесь же выполняются некоторые примитивные команды типа «нет операции», разные формы обнуления регистров и др. В этом блоке может распределяться до двух команд перехода за такт (против одной в Nehalem). Это, конечно, способствует росту производительности.
В EE в Sandy Bridge был внесен ряд доработок, приводящих к уменьшению вероятности простоя (stall), уменьшению числа конфликтов и задержек обратной записи и др. EE включает три исполнительных стека: целочисленный общего назначения; для векторных (single instruction, multiple data, SIMD) команд, как целочисленных, так и с плавающей запятой; для команд набора x87.
Планировщик направляет МОР в один из шести портов выдачи, и эти МОР выполняются в соответствующих EU. На стадии завершения результаты выполнения выбираются в соответствии с указанным в исходном коде порядком.
Трудно перечислить все нововведения Sandy Bridge, но стоит еще упомянуть поддержку двух важных для повышения производительности технологий: HyperThreading, позволяющей получить два логических процессора вместо каждого физического ядра, и TurboBoost, позволяющей автоматически повышать частоту ядер относительно номинальной, если это разрешают термические условия.
Межсоединение процессорных ядер в Sandy Bridge представляет собой двунаправленную кольцевую шину. К ней подсоединены системный агент, кэш L3 и интегрированное графическое устройство (в некоторых моделях процессора E3 оно может отсутствовать). Пропускная способность шины при тактовой частоте ядер в 3 ГГц равна 384 Гбайт/с. Кэш L3 имеет четыре «среза» — по числу ядер в процессоре; каждый срез включает собственный порт, способный передавать 32 байт за такт.
Системный агент содержит в себе арбитр доступа к кольцу, контроллер дисплея, контроллеры PCIe (x16+x4/2*x8 +x4/x8 +3*x4), контроллер шины DMI, через который подсоединяется южный мост, и контроллер памяти. Последний поддерживает два канала DDR3/1066, 1333 или 1600 шириной 8 байт каждый. Каждый канал осуществляет внеочередную обработку запросов, реализуемую собственным планировщиком, и буфер данных емкостью 32 строки кэша. B Xeon с микроархитектурой Nehalem каналов памяти было три; возможно, в поддерживающих мультипроцессирование Xeon/Sandy Bridge каналов также будет три.
Четырехъядерные Xeon E3 производятся по технологии 32 нм, содержат около 1 млрд транзисторов и имеют тепловыделение до 95 Вт (у старших моделей).
Читайте также: