Подтвердить что ты не робот

Почему были побитовые операции немного быстрее, чем операции сложения/вычитания на более старых микропроцессорах?

Сегодня я нашел этот отрывок:

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

Мне интересно, почему побитовые операции были немного быстрее, чем операции сложения/вычитания на более старых микропроцессорах.

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

Я знаю, что арифметические и поразрядные операции выполняются в течение одного тактового цикла на современных процессорах, но говоря исключительно о времени распространения для схемы, является ли задержка еще теоретически там в современных процессорах?

Наконец, у меня возник концептуальный вопрос C о выполнении операции побитового смены:

unsigned x = 1;
x <<= 5;

unsigned y = 0;
y += 32;

Оба x и y должны содержать значение 32, но потребовалось выделить 5 отдельные сдвиги влево, чтобы получить x к этому значению (как и в побитовых сдвигах, реализованных через трубы)? Чтобы уточнить, я прошу чисто о поведении схемы, а не о числе тактовых циклов.

4b9b3361

Ответ 1

В любой бинарной побитовой операции каждый выходной бит зависит только от двух соответствующих битов на входах. В операции добавления каждый выходной бит зависит от соответствующих битов в входах и всех битов вправо (в сторону более низких значений).

Например, самый левый бит 01111111 + 00000001 равен 1, но самый левый бит 01111110 + 00000001 равен 0.

В своей простейшей форме сумматор добавляет два младших бита и выдает один выходной бит и перенос. Затем добавляются следующие два младших бита, и перенос добавляется, создавая другой выходной бит, а другой переносит. Это повторяется. Таким образом, старший бит вывода находится в конце цепочки добавлений. Если вы выполняете операцию по биту, как это делали старшие процессоры, тогда требуется время, чтобы добраться до конца.

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

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

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

Ответ 2

Сложная вещь о добавлении (вы обычно получаете вычитание бесплатно) заключается в том, что есть эта неприятная проблема переноса.

Итак, вы получаете наивное решение, которое является N раз Full-Adders, где N - это то, сколько битов шириной ваш ALU.

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

Существует множество способов преодоления этого узкого места, но ни один из них не является таким простым или ресурсосберегающим, как реализация цепочки полных добавок. (самая быстрая - таблица поиска, реализованная в кремнии)

Если вы хотите получить более подробную информацию, вам, вероятно, нужно будет задать это вместо http://electronics.stackexchange.com

Ответ 3

Чтобы ответить на ваш последний вопрос, все зависит. Некоторые архитектуры имеют сдвиги на 1 (например, z80), некоторые архитектуры выставляют сдвиги большими константами и/или переменными, но реализуют их внутренне как кучу "сдвига на 1" (например, старые реализации x86), существуют некоторые архитектуры которые могут сдвигаться более чем на 1 за один цикл, но только если значение сдвига является константой, существуют некоторые архитектуры (такие как современные реализации x86), которые используют barrel shifter и может перемещаться по переменной за один цикл, и есть еще больше возможностей.

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

Ответ 4

Бит мудрый оператор выполняется за меньшее время, потому что

  • Процессор
  • принимает одну инструкцию для выполнения бит-мутной работы и (пусть скажем) взять один цикл выполнения, с другой стороны, другие арифметические инструкции (особенно, умножать и делить) принимают больше циклов выполнения
  • Большую часть времени бит мудрая операция выполняется в одном регистре, а другие арифметические инструкции, необходимые для обработки более одного регистра

То почему смена бит быстрее, чем другие арифметические операции

Ответ 5

В некоторых дополнительных реализациях должен выполняться дополнительный цикл для бит переноса. Например: 16-битное целое число требует нескольких инструкций для 8-битного процессора. Это также относится к сдвигу. Но сдвиг всегда может сдвигать биты высоты до младших бит следующего байта. Добавление должно добавить младший бит в дополнительный раунд.

Ответ 6

Это я просиял от вступления в класс сборки. Но сдвиг - это самая быстрая инструкция, которую может выполнить процессор. Для добавления и вычитания требуется несколько инструкций для выполнения. Я полагаю, что современные процессоры лучше оптимизированы.

Предположительно, кто-то может ответить на это более точно и тщательно.