сравнение и сложение двух целых чисел: подробно - PullRequest
2 голосов
/ 27 августа 2011

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

В основном я смотрю, какой из них дороже вообще ?? Также мне нужен ответ с точки зрения c, c ++, java ....

помогает ценится спасибо !!

Ответы [ 3 ]

3 голосов
/ 27 августа 2011

Ответ - да.И нет.А может быть.

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

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

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

2 голосов
/ 27 августа 2011

Простой ответ - один цикл, обе операции одинаково просты.

Трудно дать совершенно общий ответ, поскольку архитектуры процессоров удивительно сложны, когда вы углубляетесь в детали.

Все современные процессоры конвейерные.То есть, нет никаких инструкций, где операнды входят в цикл c, и результат доступен в цикле c + 1.Вместо этого инструкция разбивается на несколько этапов.

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

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

Для того, чтобы все это заработало, требуется огромная сложность.Если вы хотите сделать a + b + c, вам нужно добавить a + b, прежде чем вы сможете добавить c.Поэтому большая часть работы во внешней части процессора включает планирование.Современные процессоры используют неупорядоченное выполнение, так что процессор проверяет входящие инструкции и переупорядочивает их так, что выполняет a + b, затем выполняет какую-то другую работу и затем возвращает + c, как только результатдоступно.

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

Таким образом, современные процессоры имеют предиктор ветвления, который делает предположение о том, каким будет результат, и продолжает выполнять инструкции.Если он угадает, конвейер должен быть отброшен, а работа возобновлена ​​в другой ветви.Предсказатель ветвления очень помогает, но, тем не менее, если сравнение является точкой принятия решения в коде, ЦПУ труднее справиться с этим, чем сложением.

2 голосов
/ 27 августа 2011

Сравнение выполняется посредством вычитания, которое почти совпадает с сложением, за исключением того, что перенос и вычитание дополняются, поэтому a - b - c становится a + ~b + ~c.Это уже учтено в процессоре и в любом случае занимает одинаковое количество времени.

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