Производительности мешают точные исключения.
Например, если у нас есть последовательность a=memory[i];b=memory[j];, то мы не можем выдать вторую команду раньше первой, если есть хоть малейшее подозрение, что первая вызовет исключение (обращение не в ту область памяти
(
Read more... )
>то мы не можем выдать вторую команду раньше первой
Компилятор языка высокого уровня, кстати, может.
А почему процессор не может? ну выполнятся какие-то команды чуть раньше, чем будет исключение, обращение в не ту область памяти ошибка настолько, что наверное пофиг, что произошло несколько левых лишних присвоений до исключения.
Reply
Reply
В MIPS, например, есть команда целочисленного сложения, вызывающая исключение по переполнению. Никто её не использует, но из спецификации не выбрасывают. ;)
Reply
Компилятор-то может, но как потом выполнять? ;)
Обращение не в ту память - это, допустим, наращивание стека. Ничуть не ошибка. Команды могут выполниться так, что затрётся регистр адреса и команду нельзя будет рестартовать (ld r1,0(r2);add r2,r3,r4) и тп.
Reply
исключения - так это вообще вечная борьба, как несигнальные ошибки при вычислениях на FPU и прочие адресные трапы.
а так - классика борьбы от RISC к CISC с дальнейшим возвращением к RISC.
то есть
- дискардить результаты выполнившихся команд после той, что сгенерировала исключение и рестартовать,
- переименовывать и отцеплять потоки зависимостей (для xor eax,eax не нужно знать eax),
- спекулятивно исполнять команды (включая одну или обе ветви переходов) даже если результаты пока не готовы, пока не придётся уже натурально использовать результат,
ну и т.п. и т.д.
впрочем, вам это более чем знакомо, уверен ;)
Reply
Знакомо. Не всё удалось попробовать, но знакомо. И это очень сложно в реализации, даже для программиста потактовой модели.
Reply
Reply
Reply
Leave a comment