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

Feb 01, 2007 11:49

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

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

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

Leave a comment

_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

aruslan February 1 2007, 15:13:29 UTC
конкретно (ld r1,0(r2);add r2,r3,r4) как раз переименованием регистров решается. если оно есть ;)

исключения - так это вообще вечная борьба, как несигнальные ошибки при вычислениях на FPU и прочие адресные трапы.

а так - классика борьбы от RISC к CISC с дальнейшим возвращением к RISC.
то есть
- дискардить результаты выполнившихся команд после той, что сгенерировала исключение и рестартовать,
- переименовывать и отцеплять потоки зависимостей (для xor eax,eax не нужно знать eax),
- спекулятивно исполнять команды (включая одну или обе ветви переходов) даже если результаты пока не готовы, пока не придётся уже натурально использовать результат,
ну и т.п. и т.д.

впрочем, вам это более чем знакомо, уверен ;)

Reply

thesz February 1 2007, 19:14:06 UTC
Решается. Дискардить результаты и тп - тоже переименование. Но его пока нет. ;)

Знакомо. Не всё удалось попробовать, но знакомо. И это очень сложно в реализации, даже для программиста потактовой модели.

Reply

"алгебраический ассемблер" nealar February 1 2007, 15:47:25 UTC
Гадость редкостная. Когда человек учит нормальный ассемблер, у него в мозгу накатываются своеобразные рельсы: "если видишь mov, то в левой части может стоять такое, а в правой - этакое", а тут синтаксис таких сигналов для подкорки не содержит, и можно радостно написать AX0 = AF, ну или AX1 = AY0+AY1, а потом долго втыкать "а чё это он мне матюгается?"

Reply

Re: "алгебраический ассемблер" thesz February 1 2007, 19:14:53 UTC
Этоя ваню пугаю, чтобы он не думал про разные, там, компиляторы. ;)

Reply


Leave a comment

Up