Если процессор является бинарным компьютером, почему он медленно работает с битами? - PullRequest
0 голосов
/ 28 декабря 2018

Я обнаружил, что вопреки своей природе двоичного / двунаправленного состояния, процессоры x86 работают очень медленно при обработке команд бинарных манипуляций, таких как SHR, BT, BTR, ROL и чего-то подобного.

Например, я где-то читал, что сдвиг / вращение бита более чем на 1 позицию считается медленным (с большой задержкой, снижением производительности и такими страшными вещами).Еще хуже, когда операнды находятся в памяти (не являются ли периферийные устройства с памятью тоже?)

shl eax,1  ;ok
shl eax,7  ;slow?

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

РЕДАКТИРОВАТЬ: Теперь, после второго взгляда на запись SHL в руководстве, она включает в себя некоторые тяжелые логики микрокода!

Из руководства Intel vol.2 для shl ...

Operation
TemporaryCount = Count & 0x1F;
TemporaryDestination = Destination;
while(TemporaryCount != 0) {
    if(Instruction == SAL || Instruction == SHL) {
        CF = MSB(Destination);
        Destination = Destination << 1;
    }
    //instruction is SAR or SHR
    else {
        CF = LSB(Destination);
        if(Instruction == SAR) Destination = Destination / 2; //Signed divide, rounding toward negative infinity
        //Instruction is SHR
        else Destination = Destination / 2; //Unsigned divide
    }
    TemporaryCount = TemporaryCount - 1;
}
//Determine overflow
if(Count & 0x1F == 1) {
    if(Instruction == SAL || Instruction == SHL) OF = MSB(Destination) ^ CF;
    else if(Instruction == SAR) OF = 0;
    //Instruction == SHR
    else OF = MSB(TemporaryDestination);
}
else OF = Undefined;

Невероятно увидеть, что такая простая булева алгебра превращается в кошмар реализации.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Просто примечание.

shl eax,1 ; opcode: d1 e0
shl eax,7 ; opcode: c1 e0 07

- это фактически разные инструкции с разными кодами операций, которые потенциально обрабатываются разными логическими блоками ALU.Они используют одну и ту же мнемонику в сборке, и это может сбить с толку, но с точки зрения процессора это разные инструкции с разными кодами операций и кодировками.

0 голосов
/ 28 декабря 2018

Это просто псевдокод для инструкции, точно указывающий, что она делает.Инструкция на самом деле не реализована так.На практике все современные процессоры имеют бочкообразные переключатели или аналогичные, что позволяет им смещаться на произвольные величины за один цикл.См., Например, таблицы Агнера Фога , где он показывает задержку 1 почти для всех инструкций с битовой коррекцией.

Некоторые инструкции с битовой медленностью работают медленнее, вот несколько примеров:

  • bt, btr, bts и btc медленнее при использовании с операндами памяти из-за (a) операции чтения-изменения-записи и (b) индексации цепочки битов, которую они выполняют
  • rcr с количеством поворотов, превышающим 1, является медленным, поскольку эта инструкция почти никогда не требуется и, следовательно, не оптимизируется
  • pdep и pext немного медленнее в Intelи гораздо медленнее для AMD, возможно потому, что их реализация довольно сложна, а разделение реализации делает это проще.

На старых процессорах (скажем, 8086), процессор будет занимать столько же циклов, сколькоколичество смен было, делая одну смену каждый цикл.Такая реализация позволяет использовать АЛУ для переключения без какого-либо дополнительного аппаратного обеспечения, сокращая количество вентилей, необходимых для процессора.Ни один современный процессор, о котором я знаю, не имеет такого поведения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...