Процессоры

Cтруктура обычного компьютера с шинной организацией.

Центральный процессор — это мозг компьютера. Его задача — выполнять программы, находящиеся в основной памяти. Для этого он вызывает команды из памяти, определяет их тип, а затем выполняет одну за другой. Компоненты соединены шиной, представляющей собой набор параллельно связанных проводов для передачи адресов, данных и управляющих сигналов. Шины могут быть внешними (связывающими процессор с памятью и устройствами ввода-вывода) и внутренними. Современный компьютер использует несколько шин.

Процессор состоит из нескольких частей. Блок управления отвечает за вызов команд из памяти и определение их типа. Арифметико-логическое устройство(АЛУ) выполняет арифметические операции и логические операции.

Внутри центрального процессора находится быстрая память небольшого объема для хранения промежуточных результатов и некоторых команд управления. Эта память состоит из нескольких регистров, каждый из которых выполняет определенную функцию. Обычно размер всех регистров одинаков. Каждый регистр содержит одно число в диапазоне, верхняя граница которого зависит от размера регистра. Операции чтения и записи с регистрами выполняются очень быстро, поскольку они находятся внутри центрального процессора.

Самый важный регистр — счетчик команд, который указывает, какую команду нужно выполнять следующей. В регистре команд находится выполняемая в данный момент команда. У большинства компьютеров имеются и другие регистры.

Устройство центрального процессора

Внутреннее устройство тракта данных типичного фон-неймановского процессора

АЛУ выполняет сложение, вычитание и другие простые операции над входными данными и помещает результат в выходной регистр. Содержимое этого выходного регистра может записываться обратно в один из регистров или сохраняться в памяти, если это необходимо. Не во всех архитектурах есть регистры A, B и выходные регистры.

Слова - это элементы данных, которые перемещаются между памятью и регистрами. Словом может быть целое число. Размер слова обычно соответствует разрядности регистра данных, у 32-разрядных микропроцессоров - 32 бита.

Большинство команд можно разделить на две группы:

  1. команды типа регистр-память.Вызывают слова из памяти, помещают их в регистры, где они используется как входные данные АЛУ. Другие команды этого типа помещают регистры обратно в память.

  2. типа регистр-регистр. вызывают два операнда из регистров, помещают их во входные регистры АЛУ, выполняют над ними какую-нибудь арифметическую или логическую операцию и переносят результат обратно в один из регистров. Этот процесс называется циклом тракта данных.

Современные компьютеры оснащаются несколькими АЛУ, работающими параллельно и специализирующимися на разных функциях. Чем быстрее происходит цикл тракта данных, тем быстрее компьютер работает.

Выполнение команд

Центральный процессор выполняет каждую команду за несколько шагов:

  1. Вызывает следующую команду из памяти и переносит ее в регистр команд

  2. Меняет положение счетчика команд, который после этого указывает на следующую команду. Это происходит после декодирвоания команды, а иногда и после ее выполнения.

  3. Определяет тип вызванной команды.

  4. Если команда использует слово из памяти, определяет, где находится слово

  5. Переносит слово, если это необходимо, в регистр центрального процессора.

  6. Выполняет команду.

  7. Переходит к шагу 1, чтобы начать выполнение следующей команды

Такая последовательность шагов (выборка — декодирование — исполнение) является основой работы всех компьютеров.

Описание работы центрального процессора можно представить в виде программы.

В описываемом компьютере есть два регистра: счетчик команд PC с адресом следующей команды и аккумулятор AC, в котором хранятся результаты арифметических операций. Кроме того, имеются внутренние регистры, в которых хранится текущая команда instr, тип текущей команды instr_type, адрес операнда команды data_loc и сам операнд data. Каждая команда содержит один адрес ячейки памяти. В ячейке памяти хранится операнд — например, фрагмент данных, который нужно добавить в аккумулятор.

public class Interp{
  static int PC; // PC содержит адрес следующей команды
  static int AC; // Аккумулятор, регистр для арифметики
  static int instr; // Регистр для текущей команды
  static int instr_type; // Тип команды (код операции)
  static int data_loc; // Адрес данных или –1, если его нет
  static int data; // Текущий операнд
  static boolean run_bit = true; // Бит, который можно  сбросить,
  // чтобы остановить машину
  public static void interpret(int memory[], int  starting_address){
  // Эта процедура интепретирует программы для простой  машины,
  // которая содержит команды только с одним операндом из
  // памяти. Машина имеет регистр АС (аккумулятор). Он
  // используется для арифметических действий - например,
  // команда ADD суммирует число из памяти с АС.  Интерпретатор
  // работает до тех пор, пока не будет выполнена команда
  // HALT, вследствие чего бит run_bit поменяет значение на
  // false. Машина состоит из блока памяти, счетчика команд,   бита
  // run bit и аккумулятора AC. Входные параметры  представляют собой
  // копию содержимого памяти и начальный адрес.
    PC=starting_address;
    while (run_bit) {
        instr=memory[PC]; // Вызывает следующую команду в  instr
        PC=PC+1; // Увеличивает значение счетчика команд
        instr_type=get_instr_type(instr); // Определяет тип   команды
        data_loc=find_data(instr, instr_type); // Находит данные (–1, // если данных нет)
        if(data_loc>=0) // Если data_loc=–1, значит,  операнда нет
            data=memory[data_loc]; // Вызов данных
        execute(instr_type,data); // Выполнение команды
        }
    }
private static int get_instr_type(int addr) {...}
private static int find_data(int instr, int type) {...}
private static void execute(int type, int data) {...}
}

Мы написали программу имитирующую работу центрального процессора, которая выполняется без реального процессора. Вызвать из памяти, определять тип команд и выполнять эти команды может интерпретатор.

Также, более новые процессоры могут поддерживать все наборы команд более старых в рамках одной линейки.

Системы RISC и CISC

RISC (Reduced Instruction Set Computer — компьютер с сокращенным набором команд) противопоставлялся системе CISC (Complex Instruction Set Computer — компьютер с полным набором команд)

Суть RISC компьютеров - включение туда небольшого колличества простых команд каждая из которых выполняется за один цикл тракта данных.

Сторонники RISC обуславливали преимущества данной архитектуры тем, что если придется выполнять 4-5 команд вместо одной, которую выполняет CISC, RISC все равно выигрывает в скорости, т.к. RISC-команды выполняются в 10 раз быстрее(поскольку они не интерпретируются)

Почему с RISC было не все так хорошо?

  • Компьютеры RISC несовместимы с другими моделями.

  • Intel сумела воплотить те же идеи в архитектуре CISC. Процессоры Intel, начиная с процессора 486, содержат RISC-ядро, которое выполняет самые простые (и обычно самые распространенные) команды за один цикл тракта данных, а по обычной технологии CISC интерпретируются более сложные команды. В результате обычные команды выполняются быстро, а более сложные и редкие — медленно.

Хотя при таком «гибридном» подходе производительность ниже, чем в архитектуре RISC, новая архитектура CISC имеет ряд преимуществ, поскольку позволяет использовать старое программное обеспечение без изменений.

Принципы проектирования современных компьютеров

Принципы RISC(то к чему стремятся разработчки универсальных процессоров):

  • Все команды должны выполняться непосредственно аппаратным обеспечением. То есть обычные команды выполняются напрямую, без интерпретации микрокомандами. Устранение уровня интерпретации повышает скорость выполнения большинства команд. В компьютерах типа CISC более сложные команды могут разбиваться на несколько шагов, которые затем выполняются как последовательность микрокоманд. Эта дополнительная операция снижает быстродействие машины, но может использоваться для редко применяемых команд.

  • Компьютер должен запускать как можно больше команд в секунду. В современных компьютерах используется много различных способов повышения производительности, главный из которых — запуск как можно большего количества команд в секунду. В конце концов, если процессор сможет запустить 500 млн команд в секунду, то его производительность составляет 500 MIPS, сколько бы времени ни занимало выполнение этих команд. (MIPS — сокращение от Millions of Instructions Per Second) Этот принцип предполагает, что параллелизм должен стать важным фактором повышения производительности, поскольку запустить на выполнение большое количество команд за короткий промежуток

    времени можно только в том случае, если есть возможность одновременного выполнения нескольких команд.

Хотя команды любой программы всегда располагаются в памяти в определенном порядке, компьютер может изменить порядок их запуска (так как необходимые ресурсы памяти могут быть заняты) и (или) завершения. Конечно, если команда 1 устанавливает значение в регистр, а команда 2 использует этот регистр, нужно действовать с особой осторожностью, чтобы команда 2 не считала значение из регистра раньше, чем оно там окажется. Чтобы не допускать подобных ошибок, необходимо хранить в памяти большое количество дополнительной информации, но благодаря возможности выполнять несколько команд одновременно производительность все равно оказывается выше.

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

  • К памяти должны обращаться только команды загрузки и сохранения. Один из самых простых способов разбить операцию на отдельные шаги — сделать так, чтобы операнды большей части команд брались из регистров и возвращались туда же. Операция перемещения операндов из памяти в регистры и обратно может осуществляться в разных командах. Поскольку доступ к памяти занимает много времени, длительность которой невозможно спрогнозировать, выполнение этих команд могут взять на себя другие команды, единственное назначение которых — перемещение операндов между регистрами и памятью. То есть к памяти должны обращаться только команды загрузки и сохранения (LOAD и STORE).

Параллелизм на уровне команд

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

Конвейеры

Препятствием высокой производительности является загузка команд из памяти. Решение - заранее их выгружать и хранить в наборе регистров, буфере выборки с упреждением, т.е. когда нужна была команда она вызывалась из буфера, а обращение к памяти не происходило.

При выборке с упреждением команда обрабатывается в 2 шага:

  1. происходит выборка команды

  2. выполнение команды

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

  • C1 - вызывает команду из памяти и помещает ее в буфер, где она хранится до тех пор, пока не потребуется

  • С2 - декодируется команду, определяя ее тип и тип ее операндов

  • С3 - определяет местонахождение операндов и вызывает их из регистров или из памяти

  • С4 - выполняет команду, обычно проводя операнды через тракт данных

  • С5 - записывает результат обратно в нужный регистр

  • Цикл 1 - блок C1 обрабатывает команду 1, вызывая ее из памяти

  • Цикл 2 - блок C2 декодирует команду 1, C1 вызывается из памяти команду 2

  • Цикл 3 - блок C3 вызывает операнды для команды 1, C2 декодирует команду 2, C1 - вызывает команду 3

  • Цикл 4 - блок C4 выполняет команду 1, C3 вызывает операнды для команды 3, C2 декодирует команду 3, C1 вызывает команду 4

  • Цикл 5 - блок C5 записывает результат выполнения команды 1 обратно в регистр, другие ступени конвейера обрабатывают следующие команды

Суперскалярные архитектуры

Два конвейера вместо одного. Один блок выборки команд вызывает из памяти по 2 команды. Каждый конвейер содержит АЛУ для параллельных операций. Чтобы выполняться параллельно, две команды не должны конфликтовать из-за ресурсов (например, регистров) и ни одна из них не должна зависеть от результата выполнения другой. Как и в случае с одним конвейером, либо компилятор должен гарантировать отсутствие нештатных ситуаций (когда, например, аппаратура не обеспечивает проверку команд на несовместимость и при обработке таких команд выдает некорректный результат), либо конфликты должны выявляться и устраняться дополнительным оборудованием непосредственно в ходе выполнения команд.

Процессор 486 имел один пятиступенчатый конвейер, а Pentium - два таких конвейера, похожая схема изображена выше, но разделение функций между второй и третьей ступенями(они назывались декодер 1, декодер 2) было немного другим.

Главный конвейер(u - конвейер) мог выполнять произвольные команды, второй конвейер(v - конвейер) мог выполнять только простые команды с целыми числами, также одну простую команду с плавающей точкой(FXCH).

Проверка совместимости команд для параллельного выполнения осуществлялась по жестким правилам. Если команды, входящие в пару, были сложными или несовместимыми, выполнялась только одна из них(u - конвейер). Оставшаяся вторая команда сопоставлялась со следующей командой, команды всегда выполнялись по порядку. Специальные компиляторы для процессора Pentium объединяли совместимые команды в пары и могли генерировать программы, выполняющиеся быстрее, чем в предыдущих версиях.

Программы, в которых применяются операции над целыми числами, при той же тактовой частоте на Pentium выполняются в двое быстрее, чем на 486. Выигрыш в скорости достигался благодаря второму конвейеру.

Идея суперскалярной архиектуры - один конвейер с большим количеством функциональных блоков.

Со временем определение «суперскалярности» несколько изменилось. Теперь суперскалярными называют процессоры, способные запускать несколько команд (от четырех до шести) за один тактовый цикл. Естественно, для передачи всех этих команд в суперскалярном процессоре должно быть несколько функциональных блоков. Поскольку в процессорах этого типа, как правило, предусматривается один конвейер, его устройство обычно соответствует рисунку выше.

Параллелизм на уровне процессоров

Параллелизм на уровне процессоров реализуется за счет того, что над одним заданием работают одновременно несколько процессоров. Параллелизм на уровне команд помогает, но конвейеры и суперскалярная архитектура обычно повышают скорость работы всего лишь в 5–10 раз. Чтобы увеличить производительность в 50, 100 и более раз, нужно создавать компьютеры с несколькими процессорами.

Матричные компьютеры

Многие задачи в физических и технических науках предполагают использование циклов, массивов или других упорядоченных структур, одни и те же вычисления повторяются с разными наборами данных. Существует две схемы ускоренного выполнения больших научных программ: SIMD-процессоры и векторные процессоры.

Первую обычно представляют как параллельный компьютер, а вторую — как добавление расширения параллельного вычислителя.

Компьютеры с распараллеливанием по данным нашли много успешных применений благодаря своей выдающейся эффективности. Они могут обеспечивать существенную вычислительную мощность с меньшим количеством транзисторов по сравнению с альтернативными решениями. Компьютеры с распараллеливанием по данным являются одним из самых эффективных средств для «выжимания» производительности из кремния. Так как все процессоры выполняют одну инструкцию, системе необходим только один мозг. Соответственно процессору нужен одна ступень выборки команд, одна ступень декодирования и один блок управляющей логики. Так достигается существенная экономия, которая дает параллельным компьютерам большое преимущество перед другими процессорами — при условии, что выполняемые программы имеют упорядоченную структуру с большой степенью параллелизма.

SIMD - процессор Single Instruction - stream Multiple Data - stream. Состоит из большого числа сходных процессоров, которые выполняют одну и ту же последовательность команд применительно к разным наборам данных.

Векторный процессор очень похож на SIMD - процессор, но все операции сложения выполняются в одном блоке суммирования, который имеет конвейерную структуру.

Оба типа процессоров работают с массивами данных. Оба они выполняют одни и те же команды, которые, например, попарно складывают элементы двух векторов. Однако если у SIMD-процессора столько же суммирующих устройств, сколько элементов в массиве, векторный процессор содержит векторный регистр, состоящий из набора традиционных регистров. Эти регистры загружаются из памяти единственной командой, которая фактически делает это последовательно. Команда сложения попарно складывает элементы двух таких векторов, загружая их из двух векторных регистров в суммирующее устройство с конвейерной структурой. В результате из суммирующего устройства выходит другой вектор, который либо помещается в векторный регистр, либо сразу используется в качестве операнда при выполнении другой операции с векторами. Команды SSE (Streaming SIMD Extension) в архитектуре Intel Core используют эту модель расширения для ускорения вычислений с высокой степенью упорядоченности — например, обработки мультимедийных и научных данных.

Мультипроцессоры

Система из нескольких параллельных процессоров, имеющих общую память, называется мультипроцессором. Поскольку каждый процессор может записывать информацию в любую часть памяти и считывать информацию из любой части памяти, чтобы не допустить каких-либо нестыковок, их работа должна согласовываться программным обеспечением. В ситуации, когда два или несколько процессоров имеют возможность тесного взаимодействия, а именно так происходит в случае с мультипроцессорами, эти процессоры называют сильно связанными (tightly coupled).

Возможны разные способы воплощения этой идеи. Самый простой из них — соединение единственной шиной нескольких процессоров и общей памяти. Схема (a).

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

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

Мультикомпьютеры

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

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

Last updated