Почему выполнение расположено перед памятью в архитектуре набора инструкций?

Я изучил архитектуру процессора 3 года назад.

До сегодняшнего дня я не мог понять, почему execute находится перед memory в последовательных инструкциях.

При выполнении инструкции [ mov (%eax) %ebx] ей не нужно обращаться к памяти?

Спасибо!


person wenwenhao    schedule 20.08.2012    source источник
comment
просто возьмем это как пример. Процессор может получить инструкцию, а затем ее декодировать, а затем выполнить, а затем память. Моя проблема в том, что память не должна запускаться перед выполнением, так как (%eax) будет обращаться к памяти.   -  person wenwenhao    schedule 21.08.2012


Ответы (1)


Вспомним классический RISC-конвейер, который обычно изучают: http://en.wikipedia.org/wiki/Classic_RISC_pipeline< /а>. Вот его этапы:

  • IF = выборка инструкции
  • ID = декодирование инструкции
  • EX = выполнить
  • MEM = доступ к памяти
  • WB = Зарегистрируйтесь, отпишитесь

В RISC для работы с памятью можно использовать только load и store. И EX этап для инструкции доступа к памяти вычислит адрес в памяти (взять адрес из регистрового файла, масштабировать его или добавить смещение). Затем адрес будет передан на MEM этап.

В вашем примере mov (%eax), %ebx на самом деле загрузка из памяти без каких-либо дополнительных вычислений и может быть представлена ​​даже в RISC-конвейере:

  • IF - получить инструкцию из памяти инструкций
  • ID - инструкция декодирования, передать регистр "eax" в АЛУ в качестве операнда; запомнить "ebx" как вывод для WB (в блоке управления);
  • EX - вычислить "eax+0" в АЛУ и передать результат на следующий этап MEM (как адрес в памяти)
  • MEM - взять адрес из EX этапа (из АЛУ), перейти в память и взять значение (этому этапу может потребоваться несколько тиков для достижения памяти с блокировкой конвейера). Передать значение в WB
  • WB - взять значение из MEM и передать обратно в регистровый файл. Блок управления должен перевести регистровый файл в режим: "Запись"+"Выбран EBX"

Ситуация более сложная в истинной инструкции CISC, т.е. add (%eax), %ebx (загрузить слово T из памяти [%eax], затем сохранить T+%ebx в %ebx). Эта инструкция требует как вычисления адреса, так и добавления в ALU. Это не может быть легко представлено в простейших конвейерах RISC (MIPS).

Первый процессор x86 (8086) не был конвейерным, он выполнял только одну инструкцию в каждый момент времени. Но начиная с 80386 есть конвейер с 6 стадиями, что сложнее, чем в RISC. Есть презентация о его конвейере, сравнивающая его с MIPS: http://www.academic.marist.edu/~jzbv/architecture/Projects/projects2004/INTEL%20X86%20PIPELINING.ppt

Слайд 17 говорит:

  • Intel объединяет этапы mem и EX, чтобы избежать нагрузок и остановок, но создает паузы для вычисления адреса.
  • Все этапы в mips занимают один цикл, тогда как Intel может использовать более одного для определенных этапов. Это создает асимметричную производительность

В моем примере add будет выполняться на этом комбинированном этапе "MEM+EX" в течение нескольких тактов процессора, что приведет к множеству остановок.

Современные процессоры x86 имеют очень длинный конвейер (обычно 16 стадий), и внутри они являются RISC-подобными процессорами. Стадии декодера (3 стадии и более) разобьют самые сложные x86-инструкции на серии внутренних RISC-подобных микроопераций (иногда с помощью микрокода генерируется до 450 микроопераций на инструкцию, чаще 2-3 микрооперации). Для сложных операций ALU/MEM будет микрооперация для вычисления адреса, затем микрооперация для загрузки памяти и затем микрооперация для действия АЛУ. Микрооперации будут зависеть между собой и планироваться для разных портов выполнения.

person osgx    schedule 07.12.2012