Ещё про микропроцессоры.

Feb 01, 2007 11:49

Производительности мешают точные исключения.

Например, если у нас есть последовательность a=memory[i];b=memory[j];, то мы не можем выдать вторую команду раньше первой, если есть хоть малейшее подозрение, что первая вызовет исключение (обращение не в ту область памяти ( Read more... )

микропроцессоры, исключения, производительность, dec alpha, дизайн

Leave a comment

Comments 22

_winnie February 1 2007, 11:29:28 UTC
>a=memory[i];b=memory[j];,
>то мы не можем выдать вторую команду раньше первой
Компилятор языка высокого уровня, кстати, может.

А почему процессор не может? ну выполнятся какие-то команды чуть раньше, чем будет исключение, обращение в не ту область памяти ошибка настолько, что наверное пофиг, что произошло несколько левых лишних присвоений до исключения.

Reply

_winnie February 1 2007, 11:31:37 UTC
А всякие "опасные" операции, вроде записи в порты ввода-вывода, естественно уже должны вызывать stall с проверкой, не было ли исключений.

Reply

thesz February 1 2007, 11:37:48 UTC
Ты не поверишь, как много в современных РИСКах опасных команд. ;)

В MIPS, например, есть команда целочисленного сложения, вызывающая исключение по переполнению. Никто её не использует, но из спецификации не выбрасывают. ;)

Reply

thesz February 1 2007, 11:36:27 UTC
В ADSP2181 был алгебраический ассемблер. a=dm(i3). ;)
Компилятор-то может, но как потом выполнять? ;)

Обращение не в ту память - это, допустим, наращивание стека. Ничуть не ошибка. Команды могут выполниться так, что затрётся регистр адреса и команду нельзя будет рестартовать (ld r1,0(r2);add r2,r3,r4) и тп.

Reply


nealar February 1 2007, 15:50:15 UTC
Альфовцам зачёт! Идея отложенных исключений мне нравится.
В 386+ хоть исключения и позволяют нормальное восстановление после ошибки и рестарт (то есть: вычислить, что случилось, подсунуть вместо ошибочных значений дефолты, пересчитать заново), ни разу не видел, чтоб хоть кто-то этим пользовался. Обычно исключение просто рубит задачу: ну а тогда чем плохо если оно это сделает на пару тактов позже?

Reply

thesz February 1 2007, 19:27:12 UTC
Обычно нам нужно рестартовать программу с места исключения (не с места команды-блока исключений), поэтому выполнять что-то дальше положенного либо накладно по ресурсам железа (но можно сделать), либо просто невозможно.

Reply

nealar February 1 2007, 20:05:52 UTC
"Обычно нужно", но редко это кто-то делает, _как_задумано_.
Вместо рекавери просто убивают кусок программы, а тогда без разницы, с какого места его не рестартовали.

Reply

thesz February 1 2007, 20:08:58 UTC
Самый простой пример - это mmap и увеличение стека.

К тому же размер кэша TLB (буфера трансляции адресов) ограничен 8-16 входами и исключения по отсутствию странички в TLB встречаются ой, как часто. ;)

Reply


tamargochi February 1 2007, 16:14:56 UTC
Издеваешься надо моей френдлентой. Пушишки на тебя нет!

Reply

thesz February 1 2007, 19:15:44 UTC
;)

Постараюсь исправится. ;)

Reply


Leave a comment

Up