Является ли логическое смещение вправо на 2 быстрее в AVR? - PullRequest
7 голосов
/ 16 сентября 2010

Хотелось бы узнать, выполняется ли логическое смещение вправо быстрее при смещении на степень 2

Например, это

myUnsigned >> 4

чуть быстрее

myUnsigned >> 3

Я ценю, что первым ответом каждого будет то, что мне не следует беспокоиться о таких крошечных мелочах, как использование правильных алгоритмов и наборов для сокращения порядка. Я полностью согласен с вами, но я действительно пытаюсь выжать из встроенного чипа (ATMega328) все, что могу - я только что получил сдвиг производительности, достойный «ух-го!» заменяя деление битовым сдвигом, поэтому я обещаю вам, что это имеет значение.

Ответы [ 8 ]

19 голосов
/ 16 сентября 2010

Давайте посмотрим на таблицу:

http://atmel.com/dyn/resources/prod_documents/8271S.pdf

Насколько я вижу, ASR (арифметическое смещение вправо) всегда сдвигается на один бит и не может принимать количество сдвигаемых бит; для выполнения требуется один цикл. Следовательно, сдвиг вправо на n бит займет n циклов. Сила двух ведет себя так же, как и любое другое число.

5 голосов
/ 16 сентября 2010

В наборе команд AVR арифметическое смещение вправо и влево происходит по одному биту за раз. Таким образом, для этого конкретного микроконтроллера сдвиг >> n означает, что компилятор фактически делает n много отдельных asr операций, и я думаю, >>3 на один быстрее, чем >>4.

Кстати, это делает AVR довольно необычным.

4 голосов
/ 16 сентября 2010

Вы должны ознакомиться с документацией вашего процессора для получения этой информации.Даже для данного набора инструкций могут быть разные затраты в зависимости от модели.Например, на действительно маленьком процессоре смещение на единицу может быть быстрее, чем на другие значения (это относится к инструкциям ротации на некоторых процессорах IA32, но это только потому, что эта инструкция так редко создается компиляторами).

Согласно http://atmel.com/dyn/resources/prod_documents/8271S.pdf все логические сдвиги выполняются за один цикл для ATMega328.Но, конечно, как указано в комментариях, все логические сдвиги происходят на один бит.Таким образом, стоимость смены на n составляет n циклов в n инструкциях.

2 голосов
/ 28 июля 2013

Действительно, ATMega не имеет переключателя ствола, как большинство других 8-битных MCU.Поэтому он может сдвигаться только на 1 каждый раз вместо любых произвольных значений, таких как более мощные процессоры.В результате сдвиг на 4 теоретически медленнее медленнее, чем сдвиг на 3

Однако ATMega имеет команду перестановки nibble так что фактически x >> 4 быстрее, чем x >> 3

Если предположить, что x является uint8_t, тогда x >>= 3 реализуется 3 правыми сдвигами

x >>= 1;
x >>= 1;
x >>= 1;

, тогда как x >>= 4 требуется только обмен и немного очистки

swap(x);    // swap the top and bottom nibbles AB <-> BA
x &= 0x0f;

или

x &= 0xf0;
swap(x);

Для большего кросс-регистр сдвигов также есть различные способы его оптимизации

с переменной uint16_t y, состоящей из нижней части y0 и верхней части y1, тогда y >> 8 просто

y0 = y1;
y1 = 0;

Аналогично y >> 9 можно оптимизировать до

y0 = y1 >> 1;
y1 = 0;

В заключение, время сдвига зависит от расстояния сдвига , но оно составляет не обязательно медленнее для более длинных значений или значений не степени 2 .Как правило, для сдвига в пределах 8-битного символа потребуется не более 3 инструкций.

Вот несколько демонстраций из проводника компилятора

  • Справасдвиг на 4 достигается с помощью swap и and, как указано выше

    swap r24
    andi r24,lo8(15)
    
  • Сдвиг вправо на 3 должен быть выполнен с 3 инструкциями

    lsr r24
    lsr r24
    lsr r24
    

Сдвиги влево также оптимизируются аналогичным образом

См. Также Что быстрее: x << 1 или x << 10? </a>

2 голосов
/ 17 сентября 2010

Сначала разберите, а затем время код.Не расстраивайтесь, когда люди говорят вам, что вы зря тратите время.Знания, которые вы приобретете, позволят вам быть готовым к тушению пожаров в большой компании.Число людей с реальными знаниями за кулисами падает с пугающей скоростью в этой отрасли.

Похоже, что другие объяснили реальный ответ здесь, который показала бы разборка, инструкция сдвига одного бита.Таким образом, 4 смены займут 133% времени, которое заняло 3 смены, или 3 смены - это 75% времени 4 смен, в зависимости от того, как вы сравнили числа.И ваши измерения должны отражать эту разницу, если они не будут, я продолжу этот эксперимент, пока вы полностью не поймете время выполнения.

2 голосов
/ 16 сентября 2010

Зависит от того, как построен процессор. Если процессор имеет вращение бочки, он может сдвинуть любое количество бит за одну операцию, но это требует места на чипе и энергопотребления. Самые экономичные аппаратные средства могли бы просто вращаться один за другим с опциями, относящимися к биту обтекания. Следующим будет тот, который может вращаться на один влево или вправо. Я могу вообразить структуру, которая будет иметь 1-переключатель, 2-переключатель, 4-переключатель и т. Д., В этом случае 4 может быть быстрее, чем 3.

1 голос
/ 16 сентября 2010

Если ваш процессор targer имеет команду сдвига битов (что весьма вероятно), то от аппаратной реализации этой инструкции зависит, будет ли какая-либо разница между сдвигом битов степени 2 или некоторым сдвигом. другой номер. Однако это вряд ли что-то изменит.

0 голосов
/ 16 сентября 2010

При всем уважении, вы не должны даже говорить о производительности, пока не начнете измерять. Скомпилируйте вашу программу с разделением. Запустить. Измерьте время. Повторите со сдвигом.

...