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

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

Помощь приветствуется спасибо !!

2
koool 27 Авг 2011 в 03:14

3 ответа

Лучший ответ

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

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

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

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

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

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

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

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

2
asc99c 26 Авг 2011 в 23:34

Ответ положительный. И нет. И возможно.

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

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

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

3
Hot Licks 26 Авг 2011 в 23:21

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

2
Neil 26 Авг 2011 в 23:19