Я изучил архитектуру процессора 3 года назад.
До сегодняшнего дня я не мог понять, почему execute
находится перед memory
в последовательных инструкциях.
При выполнении инструкции [ mov (%eax) %ebx]
ей не нужно обращаться к памяти?
Спасибо!
Я изучил архитектуру процессора 3 года назад.
До сегодняшнего дня я не мог понять, почему execute
находится перед memory
в последовательных инструкциях.
При выполнении инструкции [ mov (%eax) %ebx]
ей не нужно обращаться к памяти?
Спасибо!
Вспомним классический RISC-конвейер, который обычно изучают: http://en.wikipedia.org/wiki/Classic_RISC_pipeline< /а>. Вот его этапы:
В 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 говорит:
mem
и EX
, чтобы избежать нагрузок и остановок, но создает паузы для вычисления адреса.В моем примере add
будет выполняться на этом комбинированном этапе "MEM+EX
" в течение нескольких тактов процессора, что приведет к множеству остановок.
Современные процессоры x86 имеют очень длинный конвейер (обычно 16 стадий), и внутри они являются RISC-подобными процессорами. Стадии декодера (3 стадии и более) разобьют самые сложные x86-инструкции на серии внутренних RISC-подобных микроопераций (иногда с помощью микрокода генерируется до 450 микроопераций на инструкцию, чаще 2-3 микрооперации). Для сложных операций ALU/MEM будет микрооперация для вычисления адреса, затем микрооперация для загрузки памяти и затем микрооперация для действия АЛУ. Микрооперации будут зависеть между собой и планироваться для разных портов выполнения.