Столкнувшись с разработкой GPL-ных процессоров, автор хотел бы обсудить с читателями пришедшие ему идеи.
В современных процессорах "-0" выброшен из возможных значений числа (отрицательные числа сдвинуты на числовой оси в сторону нуля), а в современных СУБД равенство поля "null" кодируется отдельным битом в специальной системной колонке, т.е. за пределами собственно поля. Однако записи обрабатываются чаще, чем массивы, поэтому резонно вернуть "-0" и кодировать им "null". Кроме того, при серией сложений и вычитаний, чтобы не потерять точность результата, нужно выполнять операции с числами примерно одинакового модуля, и значит предварительно их отсортировать, а при отсутствии сдвига отрицательных чисел по оси не нужно при обращения знака добавлять или вычитать единицу.
CPU представляет собой по сути массив процессов, память - массив плат. Тогда команды должны иметь формат "адрес-отделитель-трехбитный приказ[-целочисленный параметр-отделитель]". Команда с приказам 'L' (listen, без параметра и отделителя) заставляет устройство слушать шину и записывать все послания с шины в себя в участок, начинающийся с адреса, указанного в команде (послания не будут содержать адреса). Перед началом посланий можно издать команды с таким приказом нескольким устройствам, чтобы они принимали одновременно, и таким образом размножать данные. Команда с приказам 'N' (numbers) другому устройству заставляет его экстрагировать в шину числа, перемежающиеся в нем разделителем, в количестве, указанном в параметре команды, начиная в нем с адреса, также указанном в команде (команда с приказам 'B' (bytes) заставляет экстрагировать указанное количество байт). Началом послания является конец команд 'N' и 'В'. Все команды пересылают также в и из перенумерованных сумматоров и БПФ-преобразователей процессора, поэтому после хотя бы одного послания новая команда 'L' означает всем ранее слушавшим устройствам завершить прием, а данные в послании отправляются без их длины (чтобы не вычислять в сумматоре и ее), но послание автоматически завершается отделителем. Такая система команд позволяет оптимизировать не процессором, а компилятором.
В команде с приказам 'O' (order) значащими являются только первые три бита параметра команды. Вместе с командами 'N2' и 'В2' она конструирует некую новую команду непосредственно на шине из ответов устройств. Это достигается последовательностью "команда 'N2' одному устройству - число и отделитель из устройства - команда 'O' с трехбитным приказом - команда 'N2' другому устройству - число и отделитель из другого устройства".
Умножение и деление не выполняются напрямую, т.к. занимают квадратичное количество времени - вместо них выполняются цепочки операций БПФ-сложение-оБПФ и БПФ-вычитание-оБПФ (оБПФ - обратное БПФ, время выполнения Быстрого Преобразования Фурье есть логарифм от длины операнда). Если одно число участвует в нескольких умножениях или делениях подряд, а операции отделены друг от друга сменой содержимого кэша команд или кэша данных, то оптимизатор процессора не может обнаружить лишнюю под-последовательность БПФ-оБПФ (обычно он не может ее обнаружить и без смены содержимого кэшей). Изъятие из процессоров команд умножения и деления и добавление явной команды БПФ позволит сократить набор команд и время выполнения программы, удалить из процессора участок оптимизатора и возложить его роль на компилятор ценой некоторого увеличения длины сегмента кода. Эта цена ляжет на винчестер, которые и так уже стали безразмерными, а для кэша команд приведет не к потребности его увеличения, а к более быстрому движению команд в нем и более частому обращению за новой порцией к шине, которая простаивает в перерывах между циклами наполнения кэшей.
ОСы допускают выполнение произвольного бинарного кода, полученного с другого компьютера, а схемотехники расставляют в процессоре всевозможные ловушки, чтобы обнаружить и остановить выполнение вредоносных байтов. Эти ловушки, а также прерывание трассировки, можно выбросить из процессора, если программы копировать с машины на машину в исходном виде (или в виде байт-кода для сжатия), а затем компилировать при попытке выполнить - или заранее в свободное у процессора время, которое сейчас почему-то дарят ТНК через интернет для обогащения последних. Бинарный код никоем образом не защищает коммерческого разработчика, т.к. использовать его научились уже и хакеры, и служащие. В то же время компиляция текста занимает тем меньше времени, чем более крупные массивы информации обрабатываются одним оператором языка - операторы вызывают предварительно скомпилированные и входящие в состав ОС процедуры; а компиляция на месте позволяет отказаться не только от защищенного режима, но и от регистров сегментов и суммирования сегментов и смещений.
Если ядро процессора помнит ранее использовавшийся адрес, и если в машинную команду добавить еще один бит, то можно различать два формата адреса и уменьшить среднее количество бит в нём: при одном значении бита адрес указывается полностью, при другом - только младшие изменившиеся биты.
Видеопамять должна исчезнуть, поскольку электронная бумага хранит изображение без питания. Вслед за ней следует отказаться от GPU и PPU и возложить их функции на непомерно разросшийся CPU, который уже сейчас, как было сказано, представляет собой по сути массив процессов, или как принято говорить "ядер". Таким образом переходим к прямой передаче данных из чистокровного CPU на электронную бумагу.
Внесение в ней в каждый пиксел одного дополнительного бита позволит заполнять замкнутые контура: пиксел с установленным битом сравнивается соседними, и если у них бит не установлен, и цвет отличен, то его цвет копируется в них. Это позволяет передавать с процессора не все точки фигуры, а только ее контур (что сводит двумерную задачу к одномерной) и одну точку внутри него, что экономит пропускную способность шины.
Для каждого отрезка или просто монотонного участка, составляющего контур, можно передавать координаты одного его конца, бит выбора оси OX или OY в качестве ведущей (по которой координаты соседних точек всегда отличаются на единицу), бит выбора направления вдоль этой оси и последовательность нулей и единиц, которые указывают, отличается ли на единицу или остается той же координата по другой оси на каждый инкремент координаты по ведущей. Эти последовательности генерируются, например, алгоритмом Брезенхема для рисования кривых и отрезков. Обратите внимание, по мере роста разрешающей способности бумаги размер координат в байтах увеличивается, а с ним растет и потребность в пропускной способности шины. Заменив обе координаты каждой точки контура на один бит, шина становится нечувствительной к размеру координат в байтах.
Сборка компьютера как детского конструктора подразумевает не заводскую предопределенность разветвления шин, а произвольное соединение самим человеком-сборщиком. Топология может быть "звезда" или "общая шина". В последнем случае требуется расположение на самой шине непрограммируемого контроллера с циклическим приоритетом (дабы чипы не имели преимуществ друг перед другом - ведь не известно заранее, что будет соединено). Для каскадного соединения входы контроллера должны иметь веса, пропорциональные количеству устройств, подключенных к данному входу. Вес показывает, сколько пакетов должно пройти через данный вход, прежде чем произойдет поворот кольца приоритетов (т.е. каждый вход оборудован счетчиком пакетов). Веса должны выставляться шестеренками на самом контроллере - как кодовый замок на дипломате или в автоматической камере хранения - и изменяться по степенному закону (что отличает этот контроллер на шине от лайнера), где под показателем степени находится количество входов контроллера: например, если входов 10, то возможными значениями веса являются 1, 10, 100 и т.д.
Дмитрий Тюрин (DmitryTurin.narod.ru):
dima.turin@centrum.cz
(все письма из домена .ru попадают в спам),
dima.turin@gmail.com