МИНИСТЕРСТВО оБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Московский Государственный институт электроники и математики
(Технический университет)
Кафедра вычислительных систем и сетей
Отчет о лабораторной работе №1
«Моделирование работы многоконвейерного процессора»
по дисциплине «Организация ЭВМ, комплексов и систем»
Выполнил:
студент группы С-31
Преподаватель:
канд. техн. наук, доцент
Иванова Елена Михайловна
Москва, 2004 год
Вариант 2
Дано
Вариант кода – 2
Количество конвейеров – 2
Фрагмент кода на Ассемблере:
MOV AX, [Const1]
MOV DX, [Const3]
MOV CX, [Cnt]
MUL DX, AX
MOV [Const2], DX
SUB [Const4], [Const2]
MOV CX, [Const4]
TEST CX, BX
JZ ZERO
MUL [Const3], CX
Zero: MOV [Const5], CX
Выполнение работы
Таблица последовательности выполнения процессором микроопераций для одного конвейера:

Группы простоев фазы исполнения связаны с тем, что выборка операндов из регистров и памяти занимает больше тактов, чем исполнение команды, а в тактах 20-23 еще и тем, что для выборки операндов необходимо было дождаться записи результатов предыдущей команды, которая тоже работала с регистром DX.
Продолжение таблицы:


Аналогично, в связи с ожиданием значения [const2] имеется задержка фазы исполнения в 26-31 тактах, [const4] – 33-37, CX – 40-42.
Практически полная остановка конвейера в 43-49 тактах связана с выполнением операции условного перехода, которая должна дождаться завершения работы предыдущей команды, чтобы вычислить результат. В это время другие операции не выполняются в связи с неопределенностью дальнейших шагов.
Таблица последовательностей микроопераций для случая двух конвейеров:


За исключением описанного выше случая условного перехода, все простои связаны либо с тем, что выборка операндов производится дольше, чем исполнение микрооперации (небольшие простои), либо с тем, что для выборки операндов процессору необходимо получить результат работы другой микрооперации, которая выполняется на другом конвейере или перед текущей микрооперацией на данном конвейере. Например, простои с 20 по 33 на первом конвейере, с 14 по 26, с 28 по 38 на втором конвейере.
Вывод
Использование конвейеров теоретически выгодно, так как в идеале каждые 2-3 такта процессор будет выдавать по результату очередной микрооперации.
На практике оказывается, что эффективность такой схемы оптимизации работы существенно зависит от задачи и программиста/компилятора. Если задача обладает сильной связанностью, то она плохо поддается распараллеливанию, и , следовательно, эффективность конвейерной схемы снижается.
Также эффективность существенно зависит от оптимизирующих свойств компилятора если программа пишется на языке высокого уровня, или от искусства программиста если программа пишется на ассемблере вручную.
В целом, на возможность эффективного распараллеливания программы в основном влияют два фактора: наличие условных переходов и связанность соседних микроопераций между собой – зависимость результата одной от результата другой.
В проделанной работе выигрыш от использования конвейеров оказался незначительным – 57 против 63. Невысокий результат происходит из-за сильной связанности микроопераций. Вероятно, для подобной задачи больше бы подошла последовательная обработка, чем параллельная.
Таблица 1
Число тактов (микроопераций) для фазы выполнения операции
|
Команда |
Операция |
Число тактов |
|
MOV |
Переместить - копирование второго операнда на место первого |
2 |
|
AND |
Логическое умножение двух операндов, результат помещается на место первого операнда |
1 |
|
OR |
Логическое сложение двух операндов, результат помещается на место первого операнда |
1 |
|
XOR |
Логическое исключающее «или» двух операндов, результат помещается на место первого операнда |
1 |
|
NOT |
Инверсия операнда, результат помещается на место операнда |
1 |
|
NEG |
Изменение знака операнда |
1 |
|
JMP |
Безусловный переход по адресу, указанному в качестве операнда |
1 |
|
Jxxx |
Условный переход по адресу, указанному в качестве операнда (на метку) при выполнении условия ххх (соответствующего флага или комбинации флагов (например JZ - при установленном флаге нулевого результата ZF=1), иначе перейти к следующей команде |
2 |
|
SHL/ SHR |
Логический сдвиг влево/вправо первого операнда на количество разрядов, заданного вторым операндом |
1 |
|
TEST |
Логическое умножение двух операндов, результат никуда не помещается, устанавливаются флаги |
1 |
|
ADD |
Арифметическое сложение двух операндов, результат помещается на место первого операнда |
1 |
|
ADC |
Сложение с переносом (с учётом флага CF переноса), результат помещается на место первого операнда |
1 |
|
SUB |
Вычитание второго операнда из первого, результат помещается на место первого операнда |
1 |
|
SBB |
Вычитание с заёмом (с учётом флага CF переноса), результат помещается на место первого операнда |
1 |
|
MUL |
Умножение числа, расположенного в регистре-аккумуляторе (AL, или AX, или EAX – в зависимости от размера операнда) на операнд |
3 |
|
DIV |
Деление числа, расположенного в регистрах (AX, или DX:AX, или EDX:EAX – в зависимости от размера операнда) на операнд |
3 |
|
MOVSX /MOVZX |
Пересылка со знаковым /с нулевым расширением второго операнда на место первого |
|
|
CMP |
Сравнение двух операндов путём вычитания второго из первого и установка флагов, результат операции никуда не заносится |
|
|
INC/DEC |
Увеличение /уменьшение на 1 содержимого операнда |
|
|
PUSH |
Уменьшение значения ESP на 4 и занесение в стек операнда |
|
|
POP |
Извлечение из стека операнда, увеличение ESP на 4 |
|
|
LOOP |
Команда организации цикла, уменьшить содержимое СХ на 1, сравнить с нулём, если СХ>0 перейти по адресу, указанному в качестве операнда (по метке), иначе к следующей команде |
|
|
CLD |
Сбросить флаг направления DF=0 |
|
|
CMPSB |
Сравнение байтов, расположенных в памяти по логическим адресам DS:ESI, ES:EDI, по результату сравнения установить флаги |
|
|
CALL |
Вызов процедуры (подпрограммы), занести в стек адрес возврата EIP |
|
|
RET |
Возврат из процедуры, восстановление из стека в EIP адреса возврата |
|
|
NOP |
Пустая операция, увеличивает EIP |
|
