Рассмотрим вычисление значения выражения.
На универсальном процессоре
В случае универсального процессора формула переводится в последовательность элементарных операций, каждая из которых берёт операнды из регистров и сохраняет результаты в регистры. (Сразу оговорюсь, что размер регистров для дальнейших рассуждений не важен, т.е. это могут быть как скалярные, так и векторные регистры.) Выглядеть последовательность операций может примерно так:
Код: Выделить всё
ADD r2, r1 ; добавить значение из r2 к r1
MUL r3, r1 ; домножить r1 на r3
ADD r2, r4 ; добавить r2 к r4
MUL r4, r3 ; домножить r3 на r4
... ; и так далее
Универсальный процессор имеет фиксированный набор блоков, выполняющих арифметические операции (скажем, 4 складывателя и 2 умножателя). Он двигается по последовательности операций и определяет, как распределить операции по складывателям и умножателям, чтобы минимальное количество складывателей и умножателей простаивало. Для этого проводится анализ зависимостей операций по данным, переупорядочивание операций, переназначение регистров в операциях на дополнительные теневые регистры и т.п. Отметим, что анализ и преобразование последовательности операций потребляет много энергии.
► Показать
Предвижу возражение, что, дескать, анализ и переупорядочивание операций можно вообще не выполнять или выполнять статически (при переводе формулы в последовательность операций).
Действительно, можно. Если вообще не переупорядочивать операции, то электричества уйдёт меньше, но при этом работать программа будет значительно медленнее из-за того, что арифметические блоки будут простаивать.
Если переупорядочивать операции статически, как в архитектуре VLIW, реализованной в процессоре Эльбрус, то в идеальном случае всё будет работать быстро, а электричества уйдёт меньше. Вот только никому пока не удалось создать хороший компилятор для архитектуры VLIW, и, кроме того, реальные рабочие нагрузки далеки от идеальных (код содержит развилки, а в системе запускаются несколько параллельно работающих потоков операций, что делает невозможным статический анализ системы). Поэтому ведущие производители процессоров после ряда неудачных попыток отказались от использования архитектуры VLIW (последней попыткой был выпущенный более 20 лет назад процессор Itanium от Intel).
Пусть в какой-то момент процессор решает, что операцию "ADD r2, r1" нужно выполнить на i-том складывателе. Складыватель не припаян к транзисторам, из которых состоят регистры r2 и r1, потому что он должен быть способен складывать любые регистры. Поэтому процессор должен переключить складыватель на работу с этими регистрами. Скорее всего это реализовано через копирование данных: сначала биты регистров r2 и r1 копируются в ту область на чипе, с которой работает складыватель, затем осуществляется сложение, а затем результат сложения копируется в регистр r1. Отметим, что копирование данных также потребляет энергию.
На специализированном процессоре
При проектировании специализированного процессора мы анализируем формулу и определяем, из каких операций она состоит. Пусть в ней R аргументов, M сложений и N умножений. Тогда мы создаём на кристалле R регистров для хранения аргументов, M складывателей и N умножателей, соединяя напрямую входы и выходы этих блоков согласно формуле. В результате всё, что можно, вычисляется параллельно, так как мы сами решаем, сколько вычислительных блоков нам надо. Кроме того, электричество не тратится ни на анализ и преобразование последовательности операций, ни на копирование данных.