Детали реализации.

Nov 11, 2011 00:34

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

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

Я снова пишу о процессорах, поскольку столкнулся с замечательным семейством команд системы команд MIPS. Они называются Branch-условие-Likely. О, это песня, эти команды.

У MIPS команда перехода захватывает на выполнение следующую команду, это называется "такт задержки команды перехода", ТЗКП, branch delay slot. Это сделано для увеличения общей производительности - не теряется такт вычисления условия, - а также это получается довольно просто и не надо делать специальную машину состояний в машине выборки и выдачи команд.

Так вот, команды BGEZL и подобные ей, пропускают команду в branch delay slot, если переход не был выполнен. В этом есть польза - можно в ТЗКП внести первую команду цикла, - но эта польза нивелируется следующими соображениями, изложенными в документации на команды: BGEZL вносит существенную задержку в случае отсутствия перехода, и её надо применять только в случае 98% и более вероятности перехода. А в документации на MIPS 4KM прямо указано, что команда устарела (deprecated) и её не надо использовать.

Итак, шаги.

Первый шаг - сделаем простой процессор, с наивысшим быстродействием на данный момент, внеся в спецификацию системы команд подробность реализации, тот самый ТЗКП. Оный ТЗКП приносит 16% увеличения скорости "внутри цикла длиной в 20 наносекунд", а в изменении архитектуры интерпретатора только мешается - и исключения обрабатывай по-другому, и зависимости считай на пятый стук бубна, в общем, беда. Но самая первый вариант будет элегантен донельзя, ничего лишнего, никаких пропусков тактов с помощью машины состояний.

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

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

Четвёртым шагом является "прибыль", конечно же.

Возвращаясь к началу моего поста, практически все процессора того времени содержали ту или иную деталь реализации, вытащенную наружу: MIPS, SPARC, PA RISC - ТЗКП, ARM - PC доступен, как регистр, но в момент его использования он должен равняться адресу команды 8.

Альфа стала приятным исключением. Вроде, Power PC тоже неплох. Система команд Cell BE не оставила неприятного впечатления, наоборот.

И когда я обнаружил, что свежий дизайн - OpenRISC 1200, - тоже содержит ТЗКП... Ну, когда я об этом вспоминаю, я криво улыбаюсь. ;)

PS
Ещё, кстати. В MIPS есть команды целочисленного сложения-вычитания, которые дают исключения при переполнении. Их никто в здравом уме не использует (в кодогенераторах ни в одном не видел), но они есть в доке и их надо поддерживать. В OpenRISC это тоже есть.

Для более простой реализации процессора лучше делать как можно меньше исключений - меньше логики, всё такое. Так вот господа из OpenRISC умудрились сделать команды умножения с приёмником-регистром и деления (с регистрами умножителя) бросающими исключение. Это означает, что деление становится блокирующей командой, её нельзя выполнять параллельно с другими командами. Они неожиданно для самих себя ухудшили производительность процессора.

При этом в MIPS эти же команды спокойно выполняются, ничего не бросая, только для DIV может быть неопределённое состояние. Переполнение деления заменяется проверкой и выполнением команды исключения - в тех случаях, когда проверка нужна. А это не столь уж и частые случаи.

процессоры, mips

Previous post Next post
Up