Читать «Перелом. Часть 3» онлайн - страница 87

Сергей Владимирович Суханов

То есть по сути для выполнения одной команды требовалось выполнить две - ну, за исключением команд перехода - там счетчик команд складывался со смещением и результат помещался в счетчик команд. Работа шла почти в два раза медленнее. Вот это узкое место и расшили добавлением отдельного сумматора - теперь выполнение операций в АЛУ и вычисление адреса следующей команды шло параллельно - обработка команд АЛУ и загрузка-выгрузка регистров ускорились в два раза, а выполнение программ - минимум в полтора - все-таки некоторое количество команд было переходами. Загрузка-выгрузка также ускорились потому что теперь для инкремента счетчика команд не требовалась шина РОН-АЛУ, тогда как ранее сначала по ней шли данные в или из регистров, и только затем - вычисление адреса следующей команды. Причем этот сумматор использовался из той же схемы, что и новый блок умножения-деления - его и делали-то на сдвиговом регистре и на том самом сумматоре - если в очередном разряде множителя стоит единица - множимое и сдвинутый множитель суммируются, а если ноль - множитель просто сдвигается - мы такие схемки, помнится, рисовали в институте на третьем курсе. Работало почти так же, как и в программной реализации умножения, выигрыш был в отсутствии затрат времени на дешифрацию команд сдвига, проверки бита на ноль, суммирования с переполнением, проверки на ноль всего множителя и перехода в начало цикла, если он не ноль - все это делалось теперь аппаратно и скорость умножения многократно возросла даже при отсутствии матричного умножения. Да и деление стало работать тоже быстрее. Вот на этом сумматоре и сделали программный счетчик - при этом если выполнялась операция умножения или деления, то выигрыша от такого переноса не было, но сами эти операции были медленными, так что не страшно. А вот для остальных операций вычисление адреса и выполнялось параллельно с самой операцией.

И резервы для ускорения работы были - так, даже после введения программного счетчика операции обычно занимали четыре такта из-за общей шины регистров - сначала по ней передавался первый операнд, с следующем такте - второй, в третьем (и порой четвертом, пятом - если суммирование было без схемы быстрого переноса) шло выполнение самой операции, в четвертом (или еще большем) результат передавался по шине в один из регистров. В новых-то процессорах поступление данных из РОН на АЛУ выполнялось одновременно, так как было две шины и два набора дешифраторов адреса регистра, ну а запись обратно в регистры - на следующем такте по одной из шин - мы по мере поступления все большего количества микросхем понемногу расшивали такие узкие места. Причем эти места проистекали и из структуры команд. Так, мы применяли команды с двумя регистрами - результат всегда помещался в первый регистр-источник, то есть перезаписывал один из операндов. Если бы мы применили трехоперандную схему - с отдельным указанием регистра, в который помещать результат, то в принципе можно было бы сделать отдельную шину для записи результата. Но это, во-первых, заставило бы перейти на более длинные команды (а это потребует больше памяти) или уменьшить количество регистров (а это уменьшит возможности по оптимизации программ), а во-вторых, в дальнейшем все это можно будет развести по промежуточным регистрам, что все-равно потребуется делать с прицелом на конвейеризацию. Разрулим. В крайнем случае - сделаем как Интел - внешние команды перетранслируются во внутренние, а уж их можно делать какими угодно.