Принцип управления каждым тактом машины. Часть 1.

Одно из новых направлений в развитии современных архитектур — использование принципа программного управления каждым тактом машины. Иными словами, это разработка такой архитектуры, при которой программист, работающий на уровне машинного языка, или разработчик транслятора может с точностью до такта оценить время работы любой написанной команды, возможно с учетом ее непосредственного окружения (предшествующей команды и т.п.).

Первые машины (БЭСМ-1 и даже БЭСМ-6), в которых было всего одно универсальное арифметическое устройство, безусловно, отвечали этому принципу. Однако впоследствии в машинах появилось несколько специализированных арифметических устройств (сумматор-вычитатель, умножитель, делитель и т.д.). Их появление обусловлено тем, что возросшая интеграция микросхем позволяла это сделать, и тем, что на специализированных устройствах каждая операция выполнялась значительно быстрее, чем на едином универсальном. Как только это произошло, разработчики архитектур стали искать способ дальнейшего повышения быстродействия за счет параллельного запуска различных арифметических устройств.

Одной из первых реализаций стала модель 91 семейства IBM/360, построенная на базе старой последовательной системы команд. Следует помнить, что постоянно существовала проблема ассемблерной совместимости, которая не позволяла изменять систему команд. В результате на аппаратуру возлагалась задача отыскания таких мест в программе, которые можно было распараллелить на уровне арифметических устройств. Чтобы представить сложность этой задачи, надо иметь в виду, что, записывая программу последовательно, программист использует последовательный характер исполнения машинных команд и это оказывается скрытым в тексте программы. Например, если он в какой-либо команде записал информацию в ячейку памяти (или регистр), то при считывании этой ячейки в следующей команде он рассчитывает получить обновленное значение. Однако если аппаратуре удобно из-за наличия свободного арифметического устройства начать исполнение второй команды параллельно с первой, то на вход ее поступит еще старое содержимое памяти.

Таким образом, чтобы использовать появившееся большое число арифметических устройств для возможного распараллеливания счета, потребовалось, во-первых, аппаратно просматривать вперед много команд (в МВК «Эльбрус-2», например, при благоприятных обстоятельствах просматривается до 30 команд); во-вторых. Динамически планировать загрузку устройств с учетом упомянутой информационной зависимости команд, неявно скрытой в последовательной программе.

Все это значительно усложнило аппаратуру и сделало невозможным локально предсказать при программировании или трансляции время выполнения отдельной команды или последовательности нескольких команд. Это Усложнение особенно неприятно на данном этапе развития вычислительной техники, когда предстоит переход на большие интегральные схемы с большими сложностями отладки аппаратуры. По принципу аппаратного выявления параллельности построено большинство машин предыдущего поколения, в том числе машины «Эльбрус-1» и «Эльбрус-2». К сожалению, надо отметить, что этот принцип, значительно усложняя аппаратуру, не дает ожидаемого увеличения производительности. Если бы все устройства МВК «Эльбрус-2» были полностью конвейерными, то с учетом времени такта (47 нс), следуя методам оценки производительности Cray-1, получили бы пиковую производительность около 43 Мфлоп/с (2 флоп/такт). Переходя от флопов к обычным операциям (умножая приблизительно на 2,5), получаем около 120 млн. оп/с. Реально процессор «Эльбрус-2» имеет на 1 порядок меньшее быстродействие. При исследовании «Эльбрус-2» было видно, что динамическое планирование и плохая предсказуемость иной раз становились непреодолимым препятствием при попытках получения предельной скорости исполнения критических участков задач.