32 битовых операции по сравнению с 64 битовыми операциями на машине/ОС на 64 бита

Какая операция т.е. 32 битовых операции или 64 битовых операции (как маскирование 32 битовых флагов или 64 битовых флагов), было бы более дешевым на машине на 64 бита?

5
задан pat_en 6 April 2010 в 21:28
поделиться

3 ответа

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

Однако в некоторых архитектурах могут быть некоторые различия в том, как данные попадают в регистр. Вот некоторые ситуации, когда «собственное» значение может быть быстрее, чем меньшее значение на некотором оборудовании:

Получение данных

  • Получение значения «собственного размера» может быть быстрее , чем получение меньшего значения . То есть процессору может потребоваться выборка 64 бита в любом случае, а затем замаскировать / сдвинуть 32 бита, чтобы «загрузить» 32-битное значение. Это маскирование / сдвиг не требуется при работе с 64-битным значением, поэтому его можно загрузить быстрее. (Это противоречит интуитивной идее о том, что загрузка вдвое большего размера может занять в два раза больше времени).

  • В качестве альтернативы, если шина может обрабатывать выборки половинной ширины, тогда 32 бита могут быть загружены одновременно с 64-битным значением.

  • Что еще больше сбивает с толку, кеши ЦП также могут изменять результаты. Обычно, когда вы читаете одно значение из памяти, в кэш считывается «строка» из нескольких ячеек памяти, так что последующие чтения могут производиться из быстрой кэш-памяти вместо того, чтобы требовать полной выборки из ОЗУ. В этом случае использование 32-битных значений будет работать быстрее, если вы обращаетесь ко многим значениям последовательно, так как в два раза больше из них будет кэшировано, что приведет к меньшему количеству промахов в кеше.

Вычисление

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

  • В качестве альтернативы, могут быть 32-битные и 64-битные пути через ЦП, или ЦП может выполнять любые необходимые преобразования таким образом, чтобы это не влияло на общее время выполнения инструкции, и в этом случае они могут быть рассчитаны с той же скоростью.

  • Это может повлиять на сложные операции (с плавающей запятой), но вряд ли будет проблемой с простыми операциями (И, ИЛИ и т. Д.).

4
ответ дан 14 December 2019 в 04:34
поделиться

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

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

2
ответ дан 14 December 2019 в 04:34
поделиться

Это зависит - при маскировке флага обычно используется инструкция И, которая будет выполняться быстро (~ 1 цикл) после того, как данные окажутся в регистре.Загрузка 64 бита данных из памяти, как правило, будет медленнее, чем загрузка 32 бита данных, но если вы используете более 32 флагов, вам все равно придется загружать более 32 бита данных и обрабатывать маскирование за один цикл увеличит скорость по сравнению с двумя или тремя инструкциями. Повлияет ли что-либо из этого на общую скорость, как правило, будет зависеть от окружающих инструкций - например, если данные в любом случае уже находятся в кеше, вам может не потребоваться загружать их из памяти.

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

2
ответ дан 14 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: