Инструкция процессора, прерывающая непрерывную последовательность выполнения инструкций
Обновлено: 21.11.2024
ARM использует модель загрузки-сохранения для доступа к памяти, что означает, что только инструкции загрузки/сохранения (LDR и STR) могут получить доступ к памяти. В то время как в x86 большинству инструкций разрешено напрямую работать с данными в памяти, в ARM данные должны быть перемещены из памяти в регистры перед операцией. Это означает, что для увеличения 32-битного значения по определенному адресу памяти в ARM потребуется три типа инструкций (загрузка, увеличение и сохранение), чтобы сначала загрузить значение по определенному адресу в регистр, увеличить его в регистре и сохранить его обратно в память из регистра.
Чтобы объяснить основы операций загрузки и сохранения в ARM, мы начнем с простого примера и продолжим рассмотрение трех основных форм смещения с тремя разными режимами адресации для каждой формы смещения. Для каждого примера мы будем использовать один и тот же фрагмент ассемблерного кода с разными формами смещения LDR/STR, чтобы не усложнять задачу. Лучший способ следовать этой части руководства — запустить примеры кода в отладчике (GDB) в лабораторной среде.
- Форма смещения: непосредственное значение в качестве смещения
- Режим адресации: смещение
- Режим адресации: предварительно индексированный
- Режим адресации: постиндексированный
- Форма смещения: зарегистрируйтесь как смещение
- Режим адресации: смещение
- Режим адресации: предварительно индексированный
- Режим адресации: постиндексированный
- Форма смещения: масштабированный регистр как смещение
- Режим адресации: смещение
- Режим адресации: предварительно индексированный
- Режим адресации: постиндексированный
Первый базовый пример
Как правило, LDR используется для загрузки чего-либо из памяти в регистр, а STR используется для сохранения чего-либо из регистра в адрес памяти.
Операция LDR: загружает значение по адресу, найденному в R0, в регистр назначения R2.
Операция STR: сохраняет значение, найденное в R2, по адресу памяти, найденному в R1.
Вот как это будет выглядеть в функциональной программе сборки:
Внизу у нас есть литеральный пул (область памяти в том же разделе кода для хранения констант, строк или смещений, на которые другие могут ссылаться независимым от позиции способом), где мы храним адреса памяти var1 и var2 ( определено в разделе данных вверху), используя метки adr_var1 и adr_var2. Первый LDR загружает адрес var1 в регистр R0. Второй LDR делает то же самое для var2 и загружает его в R1. Затем мы загружаем значение, хранящееся по адресу памяти, найденному в R0, в R2, и сохраняем значение, найденное в R2, по адресу памяти, найденному в R1.
Когда мы что-то загружаем в регистр, скобки ([ ]) означают: значение, найденное в регистре между этими скобками, является адресом памяти, из которого мы хотим что-то загрузить.
Когда мы сохраняем что-то в ячейке памяти, скобки ([ ]) означают: значение, найденное в регистре между этими скобками, является адресом памяти, по которому мы хотим что-то сохранить.
Звучит сложнее, чем есть на самом деле, поэтому вот наглядное представление того, что происходит с памятью и регистрами при выполнении приведенного выше кода в отладчике:
Давайте посмотрим на тот же код в отладчике.
Примечание: если вы забыли, почему действующий ПК расположен на две инструкции впереди текущей, это описано в Части 2 [… Во время выполнения ПК сохраняет адрес текущей инструкции плюс 8 (две инструкции ARM) в состоянии ARM и текущая инструкция плюс 4 (две инструкции Thumb) в состоянии Thumb. Это отличается от x86, где ПК всегда указывает на следующую выполняемую команду…].
1. Форма смещения: непосредственное значение в качестве смещения
Здесь мы используем непосредственное (целое) значение в качестве смещения. Это значение добавляется или вычитается из базового регистра (R1 в приведенном ниже примере) для доступа к данным со смещением, известным во время компиляции.
Давайте назовем эту программу ldr.s, скомпилируем ее и запустим в GDB, чтобы посмотреть, что произойдет.
В GDB (с помощью gef) мы устанавливаем точку останова на _start и запускаем программу.
Регистры в моей системе теперь заполнены следующими значениями (имейте в виду, что эти адреса могут отличаться в вашей системе):
Вот абстрактная иллюстрация того, что происходит:
2. Форма смещения: Зарегистрируйтесь как смещение.
В этой форме смещения в качестве смещения используется регистр. Пример использования этой формы смещения — когда ваш код хочет получить доступ к массиву, где индекс вычисляется во время выполнения.
После выполнения первой операции STR в режиме смещения адреса значение R2 (0x00000003) будет сохранено по адресу памяти 0x0001009c + 0x00000003 = 0x0001009F.
Вторая операция STR с режимом предварительно индексированного адреса будет делать то же самое, с той разницей, что она обновит базовый регистр (R1) вычисленным адресом памяти (R1+R2).
Последняя операция LDR использует режим постиндексированного адреса и загружает значение по адресу памяти, найденному в R1, в регистр R2, затем обновляет базовый регистр R1 (R1+R2 = 0x1009f + 0x3 = 0x100a2). р>
3. Форма смещения: масштабированный регистр как смещение
Третья форма смещения имеет масштабированный регистр в качестве смещения. В этом случае Rb является базовым регистром, а Rc является непосредственным смещением (или регистром, содержащим непосредственное значение), сдвинутым влево/вправо ( ) для масштабирования непосредственного. Это означает, что переключатель баррель используется для масштабирования смещения. Примером использования этой формы смещения может быть цикл для перебора массива. Вот простой пример, который вы можете запустить в GDB:
Обзор
Запомните три режима смещения в LDR/STR:
Как запомнить разные режимы адресов в LDR/STR:
LDR используется не только для загрузки данных из памяти в регистр. Иногда вы увидите такой синтаксис:
Загрузка немедленных значений в регистр на ARM не так проста, как на x86. Существуют ограничения на то, какие непосредственные значения вы можете использовать. Что это за ограничения и как с ними бороться — не самая захватывающая часть сборки ARM, но потерпите меня, это просто для вашего понимания, и есть приемы, которые вы можете использовать, чтобы обойти эти ограничения (подсказка: LDR). < /p>
Мы знаем, что каждая инструкция ARM имеет длину 32 бита и все инструкции являются условными. Есть 16 кодов условий, которые мы можем использовать, и один код состояния занимает 4 бита инструкции. Затем нам нужны 2 бита для регистра назначения. 2 бита для регистра первого операнда и 1 бит для флага set-status, а также различное количество битов для других вещей, таких как фактические коды операций. Дело в том, что после назначения битов типам инструкций, регистрам и другим полям для непосредственных значений остается только 12 битов, что позволяет использовать только 4096 различных значений.
Это означает, что инструкция ARM может напрямую использовать только ограниченный диапазон немедленных значений с MOV. Если число нельзя использовать напрямую, оно должно быть разделено на части и составлено из нескольких меньших чисел.
Вот несколько примеров допустимых и недопустимых непосредственных значений:
Это приводит к тому, что невозможно загрузить полный 32-битный адрес за один раз. Мы можем обойти это ограничение, используя один из следующих двух вариантов:
Если вы попытаетесь собрать этот код, ассемблер выдаст ошибку:
Вам нужно либо разделить 511 на несколько частей, либо использовать LDR, как я описал ранее.
Решение домашнего задания 4
<ПР> (10 баллов) Рассмотрим систему, в которой ЦП использует управляющую последовательность, аналогичную показанной на рис. 3.5, и что ЦП и память работают синхронно. <ПР> Предположим, что операция с памятью занимает столько же времени, сколько один внутренний шаг ЦП. Перепишите управляющую последовательность.
<ПР> Перенос данных из одного регистра в другой.
Далее рассмотрим инструкцию Add с управляющей последовательностью, показанной на рис. 3.5. Процессор управляется постоянно работающим тактовым сигналом, так что каждый шаг управления составляет 20 нс. по продолжительности. Как долго процессору придется ждать на шагах 2 и 5, если предположить, что операция чтения памяти занимает 80 нс. завершить? Какой процент времени простаивает ЦП во время выполнения этой инструкции?
ЦП ожидает 60 нс. на каждом из шагов. (На каждый из шагов уходит 20 нс.) Общее время выполнения инструкции составляет 260 нс. с 120 нс. ожидания. ЦП простаивает в течение 46 % времени выполнения инструкции.
<ПР> Добавьте непосредственное значение NUM в регистр R1.
<ПР> Структура шины на рисунке 3.1. <ПР> Добавьте непосредственное значение NUM в регистр R1.
<ПР> Добавьте непосредственное значение NUM в регистр R1.
для структуры шины на рисунке 3.13.
Дополнительный кредит. (10 баллов) В разделе 3.4.1 указано, что простые защелки на рис. 3.3 нельзя использовать для реализации регистров на рис. 3.13. Вместо этого необходимы триггеры с срабатыванием по фронту или триггеры ведущий-ведомый. Однако можно ли было бы использовать защелки, показанные на рис. 3.3, если бы регистр Z был включен между выходом АЛУ и шиной С, как на рис. 3.1? Обосновать ответ. Как это повлияет на производительность?
Да, защелки на рис. 3.3 можно было бы использовать, если бы был включен регистр Z.Проблема с защелками заключается в том, что их нельзя использовать для одновременного чтения и записи. Включение регистра Z гарантирует, что этого не произойдет, поскольку все операции АЛУ разбиваются на два этапа: чтение регистров операндов на шины А и В и загрузка Z; и прочитайте Z на шину C и загрузите регистр назначения.
Это существенно влияет на производительность. Каждая операция ALU теперь требует двух тактов. Это сводит на нет большую часть повышения производительности, полученного за счет использования нескольких шин ЦП.
Исследуйте мир информатики
Цикл инструкций
Организация и архитектура компьютера
Инструкционный цикл — это время, необходимое ЦП для выполнения одной отдельной инструкции. Командный цикл — это базовая операция ЦП, состоящая из трех шагов.
ЦП многократно выполняет выборку, декодирование, цикл выполнения для выполнения одной программной инструкции. Машинный цикл является частью командного цикла.
Основной функцией компьютерной системы является выполнение программы. Компьютерная программа состоит из набора инструкций. Центральный процессор ( ЦП ) отвечает за выполнение этих программных инструкций.
Что такое цикл инструкций?
Инструкции программы хранятся в основной памяти RAM. Память компьютера организована по количеству ячеек. Каждая ячейка (местоположение) имеет определенный адрес памяти.
Процессор инициирует выполнение программы, извлекая машинные инструкции одну за другой из ОЗУ основной памяти.
ЦП выполняет эти инструкции, повторяя последовательность из четырех шагов, называемую командным циклом. Каждая часть командного цикла требует определенного количества машинных циклов для завершения этой части.
Чтобы понять цикл инструкций, важно сначала понять некоторые связанные темы, прежде чем мы начнем обсуждение концепции цикла инструкций.
Как компьютер выполняет программу?
В этой статье вы узнаете, что такое командный цикл и как он связан с машинным циклом.
Мы также обсудим некоторые фундаментальные понятия, например, что такое программные инструкции , формат инструкций , как блок управления декодирует инструкции, тактовую частоту процессора и цикл инструкций.
Давайте сначала начнем с некоторых основных фундаментальных важных понятий, необходимых для понимания того, как работает цикл инструкций.
Цикл инструкций
Организация и архитектура компьютера
Оглавление
Что такое компьютерная программа?
Компьютерной системе нужен набор инструкций, которые предписывают компьютеру выполнять нужные операции. Этот набор инструкций, который компьютер может интерпретировать и выполнять, называется компьютерной программой.
Компьютерная программа является важным компонентом любой компьютерной системы. Выбор языка программирования зависит от типа разрабатываемого программного обеспечения.
Прикладное программное обеспечение написано с использованием языков программирования высокого уровня. Некоторые часто используемые языки программирования включают язык C , C++ , Java , JavaScript и Python.
Компьютерная программа
Компиляция программы
Компьютерная программа, написанная на любом языке программирования высокого уровня, должна быть преобразована в машиночитаемый двоичный формат.
Инструкции машинного кода в двоичном формате — это низкоуровневый набор программных инструкций, которые могут выполняться непосредственно компьютерной системой.
Цикл инструкций
Что такое инструкция программы?
Компьютерная программа состоит из набора операторов программы, также называемых программными инструкциями. Каждая инструкция программы выполняет определенную задачу.
Программные инструкции — это машинные инструкции в двоичном формате, которые ЦП может выполнять напрямую. Операционная система загружает машинные инструкции в оперативную память основной памяти, чтобы инициировать выполнение программы.
ЦП запускает выполнение программы, извлекая их одну за другой. Блок управления декодирует машинные инструкции в соответствии с форматом инструкции.
Компьютерная программа использует различные типы программных инструкций в соответствии с логикой и алгоритмом программы.
Например, программная инструкция может либо выполнять операции ввода и вывода, либо арифметические вычисления, либо какую-либо логическую операцию принятия решения.
Инструкции по программе
Во время компиляции программы каждая инструкция программы преобразуется в машинную инструкцию в двоичном формате.
В зависимости от типа языка программирования компилятор программы преобразует всю программу в исполняемый код (набор машинных инструкций). В случае интерпретируемого языка это преобразование происходит построчно.
Исполняемый код состоит из набора машинных инструкций в двоичном формате, которые могут быть напрямую декодированы и выполнены процессором.
Компиляция программы
Что такое центральный процессор?
Центральный процессор ( ЦП ) — это мозг и механизм обработки компьютерной системы. ЦП обеспечивает реальную вычислительную мощность системы.
Основной функцией ЦП является выполнение компьютерной программы и управление всеми операциями, выполняемыми компьютерной системой.
Выполнение программы
Микропроцессор (ЦП)
ЦП внутри состоит из нескольких блоков, каждый из которых выполняет определенную задачу. К внутренним блокам ЦП относятся блок памяти (MU), арифметико-логический блок (ALU) и блок управления (CU).
ЦП выполняет инструкции компьютерной программы, повторяя процесс, называемый машинным циклом.
Микроархитектура процессора
Архитектура набора инструкций ЦП (ISA)
Каждая микросхема микропроцессора реализует и поддерживает набор двоичных команд, которые ЦП может декодировать и выполнять.
Этот набор команд жестко встраивается в схему микропроцессора в процессе производства чипа процессора. Этот набор команд, реализуемых ЦП, называется архитектурой набора инструкций (ISA).
Архитектура набора инструкций
Архитектура набора инструкций
И по этой причине компилятор компилирует программу для конкретной платформы. Компилятор программы генерирует исполняемый код, который может выполняться на определенной платформе.
Цикл инструкций
Формат инструкции
Что такое формат инструкции?
Компьютерная программа состоит из ряда инструкций, которые предписывают ЦП выполнять определенную операцию.
Однако центральному процессору необходимо знать подробности, например, какая операция должна быть выполнена, над какими данными и где находятся данные. Эта информация предоставляется форматом инструкции.
ЦП начинает выполнение программы, извлекая программные инструкции одну за другой из основной памяти ОЗУ. Блок управления ЦП декодирует программную инструкцию.
Формат инструкций программы
Блок управления ЦП декодирует инструкцию на основе формата инструкции.
Это формат инструкции, который содержит сведения о выполняемой операции (код операции), эффективный адрес операнда и данные (операнд), над которыми должна быть выполнена операция.
Формат инструкции определяет расположение и структуру программной инструкции, которая может быть декодирована ЦП, а затем выполнять требуемую операцию с данными.
Формат инструкции по существу состоит из трех частей, включая КОД ОПЕРАЦИИ, ОПЕРАНД и РЕЖИМ адресации.
Формат машинных инструкций
- Режим обращения
- ОПКОД
- ОПЕРАНД
- Режим обращения
- ОПКОД
- ОПЕРАНД
Формат инструкции
Что такое код операции?
ОПКОД
В микропроцессорной архитектуре OPCODE является частью машинной инструкции, которая указывает, какая операция должна выполняться ЦП при выполнении инструкции.
КОД ОПЕРАЦИИ указывает блоку управления ЦП работать с данными ( ОПЕРАНД ) в соответствии с архитектурой набора команд (ISA) микросхемы процессора.
Формат инструкции
Что такое ОПЕРАНД?
ОПЕРАНД
В микропроцессорной архитектуре ОПЕРАНД просто означает данные, с которыми ЦП выполняет требуемую операцию.
ОПЕРАНД — это часть машинной инструкции, которая указывает либо сами данные, либо ссылку на данные, например адрес памяти, содержащий фактические данные.
ЦП декодирует часть ОПЕРАНДА машинной инструкции, как указано в режиме адресации. В формате инструкции используются различные типы режимов адресации.
Формат инструкции
Что такое режим адресации?
РЕЖИМ АДРЕСАЦИИ
В микропроцессорной архитектуре режим адресации является частью машинной инструкции, которая определяет правила для ЦП при работе с частью ОПЕРАНДА машинной инструкции.
Часть режима адресации формата машинных инструкций позволяет указать, является ли значение OPERAND прямыми данными или косвенной ссылкой.
Биты ОПЕРАНДА могут представлять либо непосредственное значение, либо адрес основной памяти, либо номер регистра ЦП. Именно режим адресации указывает тип значения ОПЕРАНДА.
Формат инструкции — режим адресации
Если режим адресации указан как косвенный, тогда ОПЕРАНД содержит адрес памяти, указывающий на фактические данные.
Формат инструкции машинного кода может использовать десять различных типов режимов адресации в зависимости от типа инструкции.
Машинный цикл
Что такое машинный цикл?
Операционная система загружает исполняемую копию программного кода и данные, которые необходимо обработать, в оперативную память основной памяти. Основная память содержит набор программных инструкций в виде машинных инструкций.
ЦП отвечает за выполнение этих машинных инструкций. Чтобы выполнить любую задачу, ЦП должен многократно выполнять последовательность шагов. Эта последовательность шагов называется машинным циклом.
Машинный цикл является частью командного цикла. ЦП может выполнять определенное количество машинных циклов для выполнения одной инструкции.
Машинный цикл
Машинный цикл — это базовая операция микропроцессора для выполнения любой деятельности. Для завершения каждой части командного цикла требуется определенное количество машинных циклов.
ЦП непрерывно выполняет машинный цикл, чтобы выполнять программные инструкции одну за другой.
Цикл инструкции состоит из последовательности четырех шагов. Эти четыре операции ЦП включают выборку, декодирование, выполнение и сохранение.
ЦП выполняет определенное количество циклов машинного цикла для завершения операций выборки, декодирования, выполнения и сохранения.
И поэтому, чтобы выполнить одну единственную программную инструкцию, ЦП может потребоваться один или несколько машинных циклов. Требуемое количество машинных циклов зависит от типа и архитектуры ЦП.
Например, процессорам 8085 и 8086 потребуется разное количество машинных циклов для выполнения одной и той же инструкции.
Это первое руководство из семинара "Начало работы с ливерморскими вычислениями". Он предназначен для предоставления лишь краткого обзора обширной и обширной темы параллельных вычислений в качестве вводной части для последующих руководств. Таким образом, он охватывает только самые основы параллельных вычислений и предназначен для тех, кто только знакомится с предметом и планирует посетить одно или несколько других руководств на этом семинаре. Он не предназначен для подробного рассмотрения параллельного программирования, так как это потребует значительно больше времени. Учебное пособие начинается с обсуждения параллельных вычислений — что это такое и как оно используется, после чего следует обсуждение концепций и терминологии, связанных с параллельными вычислениями. Затем исследуются темы параллельных архитектур памяти и моделей программирования. За этими темами следует серия практических дискуссий по ряду сложных вопросов, связанных с проектированием и выполнением параллельных программ. Учебник завершается несколькими примерами того, как распараллелить несколько простых задач. Ссылки включены для дальнейшего самостоятельного изучения.
Обзор
Что такое параллельные вычисления?
Последовательные вычисления
Традиционно программное обеспечение писалось для последовательных вычислений:
- Задача разбита на отдельные серии инструкций.
- Инструкции выполняются последовательно одна за другой
- Выполняется на одном процессоре
- В любой момент времени может выполняться только одна инструкция
Например:
Параллельные вычисления
Проще говоря, параллельные вычисления — это одновременное использование нескольких вычислительных ресурсов для решения вычислительной задачи:
- Проблема разбивается на отдельные части, которые можно решать одновременно
- Каждая часть далее разбита на серию инструкций.
- Инструкции из каждой части выполняются одновременно на разных процессорах
- Используется общий механизм контроля/координации
Например:
- Вычислительная задача должна уметь:
- Разбить на отдельные части работы, которые можно решать одновременно;
- Выполнение нескольких программных инструкций в любой момент времени;
- Решайте задачи быстрее, используя несколько вычислительных ресурсов, чем один вычислительный ресурс.
- Один компьютер с несколькими процессорами/ядрами
- Произвольное количество таких компьютеров, объединенных в сеть
Параллельные компьютеры
- Сегодня практически все автономные компьютеры параллельны с аппаратной точки зрения:
- Несколько функциональных блоков (кеш L1, кэш L2, переход, предварительная выборка, декодирование, операции с плавающей запятой, обработка графики (GPU), целые числа и т. д.)
- Несколько исполнительных блоков/ядер
- Несколько аппаратных потоков
- Сети соединяют несколько автономных компьютеров (узлов) для создания больших параллельных компьютерных кластеров.
- Например, на приведенной ниже схеме показан типичный кластер параллельных компьютеров LLNL:
- Каждый вычислительный узел сам по себе является многопроцессорным параллельным компьютером
- Несколько вычислительных узлов объединены в сеть Infiniband.
- Узлы специального назначения, также многопроцессорные, используются для других целей.
- Большинство больших параллельных компьютеров (суперкомпьютеров) в мире представляют собой кластеры оборудования, произведенного несколькими (в основном) известными поставщиками.
Зачем использовать параллельные вычисления?
Реальный мир чрезвычайно сложен
- В естественном мире множество сложных, взаимосвязанных событий происходит одновременно, но в рамках временной последовательности.
- По сравнению с последовательными вычислениями параллельные вычисления гораздо лучше подходят для моделирования, имитации и понимания сложных явлений реального мира.
- Например, представьте себе их последовательное моделирование:
Основные причины использования параллельного программирования
ЭКОНОМЬТЕ ВРЕМЯ И/ИЛИ ДЕНЬГИ
- Теоретически, выделение большего количества ресурсов для выполнения задачи сократит время ее выполнения и потенциально сэкономит средства.
- Параллельные компьютеры могут быть собраны из дешевых, широко распространенных компонентов.
РЕШАТЬ БОЛЬШИЕ/БОЛЕЕ СЛОЖНЫЕ ПРОБЛЕМЫ
ОБЕСПЕЧИТЬ ПАРАЛЛЕЛЬНОСТЬ
- Один вычислительный ресурс может одновременно выполнять только одну операцию. Несколько вычислительных ресурсов могут выполнять множество задач одновременно.
- Пример. Сети для совместной работы представляют собой глобальную площадку, где люди со всего мира могут встречаться и работать «виртуально».
ИСПОЛЬЗОВАТЬ НЕМЕСТНЫЕ РЕСУРСЫ
- Использование вычислительных ресурсов в глобальной сети или даже в Интернете, когда локальных вычислительных ресурсов недостаточно или недостаточно.
- Пример. SETI@home (setiathome.berkeley.edu) насчитывает более 1,7 миллиона пользователей почти во всех странах мира (май 2018 г.).
ЛУЧШЕ ИСПОЛЬЗОВАТЬ БАЗОВОЕ ПАРАЛЛЕЛЬНОЕ ОБОРУДОВАНИЕ
- Современные компьютеры, даже ноутбуки, имеют параллельную архитектуру с несколькими процессорами/ядрами.
- Параллельное программное обеспечение специально предназначено для параллельного оборудования с несколькими ядрами, потоками и т. д.
- В большинстве случаев последовательные программы, запускаемые на современных компьютерах, «тратят впустую» потенциальную вычислительную мощность.
Будущее
Кто использует параллельные вычисления?
Наука и техника
Исторически параллельные вычисления считались «высшим уровнем вычислений» и использовались для моделирования сложных задач во многих областях науки и техники:
- Атмосфера, Земля, Окружающая среда
- Физика - прикладная, ядерная, частица, конденсированное состояние, высокое давление, термоядерный синтез, фотоника.
- Бионаука, биотехнология, генетика
- Химия, молекулярные науки
- Геология, сейсмология
- Машиностроение: от протезов до космических кораблей
- Электротехника, схемотехника, микроэлектроника
- Информатика, математика
- Оборона, Оружие
Промышленные и коммерческие
Сегодня коммерческие приложения являются равной или даже большей движущей силой в разработке более быстрых компьютеров. Эти приложения требуют сложной обработки больших объемов данных. Например:
Читайте также: