Alexander Kuklev (akuklev) wrote,
Alexander Kuklev
akuklev

В 2011 году в наборы команд мейнстримных процессоров проникнет операция FMA4 = четырёхоперандный Fused multiply-add, т.е. операция вида:
    r = ab + c.
(r, a, b и с номера регистров.)

Мало кто знает об этом, однако существует и другая крайне полезная в хозяйстве четырёхоперандная операция: универсальная побитовая, emux. Начнём с того, что существует крайне полезная операция mux = multiplex by mask, делающая со своими аргументами вот что побитово:
r = (a ∧ c) ∨ (b ∧ ¬c).
Тут a, b и с либо задают либо номер регистра, либо константу 0, либо константу 1.

То есть, в тех местах, где c = 1 оно берёт содержимое a, а в тех местах, где c = 0, берёт содержимое b. Это с огромным отрывом наиболее часто используемая тернарная булева операция. Несколько доработав технические детали можно сделать так, чтобы все возможные бинарные логические операции были частными случаями mux.

Проистекает эта возможность из того, что у данной операции есть полезное свойство: когда a = c, она превращается в ∨ (или), когда b = c превращается в ∧ (и). Случай a ≡ b (операнды совпадают) сам по себе неинтересен, поэтому можно потребовать, чтобы в этом случае операция превращась в ¬⊕ (xnor/cmp). Более того, ¬⊕, ∨ и ∧ коммутативны и тривиальны в случае совпадающих операндов, потому можно потребовать, чтобы они срабатывали прямо только если операнды (номера регистров) отсортированы прямо; а если они отсортированы обратно, то срабатывали отрицания этих операций. Таким образом мы получаем nand, nor и xor. В случае совпадения всех трёх аргументов получаем not. Учитывая специфику работы современных процессоров такое усложнение кодирования не создаст замедлений.

Нехватает двух бинарных логических операций: → и её отрицания. При b = 1 mux превращается в →. Случай же b ≡ 0 неинтересен сам по себе, т.к. превращает mux в and, что можно получить другими способами. Таким образом целесообразно в случае b ≡ 1 считать отрицание → от оставихся операндов.

Более полезное применение можно найти ещё случаям c ≡ 0 и с ≡ 1 (mux в этом случае просто выдавало бы первый или второй операнд соответственно), а также случаям a ≡ 0 и a a ≡ 1 (mux в этих случаях превращается в nand и or соответственно). В качестве четырёх дополнительных логических операций я бы предложил горизонтальное сложение (подсчёт количества единиц в a ∧ ¬b), циклический сдвиг (направление определяется знаком второго аргумента) и матричные логические операторы Иверсона (MOR и MXOR), они очень-очень полезные, об этом можно почитать у Кнута. Таким образом одним opcode'ом кодируются все логические операции, которые только могут понадобиться в народном хозяйстве. По причине простой схемотехнической реализации побитовых операций и краткого критического пути, все из них быстрые, однотактовые.
Subscribe

  • (no subject)

    Встретил фотографию толпы футбольных фанатов, и она меня скорее напугала, у меня уж точно нет желания быть там среди них. Но внезапно я понял, что…

  • Прогресс

    Десять дней назад, вторая ступень SpaceX'овского корабля Starship своим ходом слетала своим ходом на десять километров вверх, и усмепшно приземлилась…

  • О водосбережении

    Как известно, питьевая вода во многих странах дефицитный ресурс. И даже в дождливой Германии летом иногда случаются засухи, в результате которых она…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments