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