32-битная операция против 64-битной операции на 64-битной машине / ОС - PullRequest
4 голосов
/ 07 апреля 2010

Какая операция, то есть 32-битная или 64-битная операция (например, маскирование 32-битного или 64-битного флага), будет дешевле на 64-битной машине?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2010

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

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

Выборка данных

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

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

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

Исчисление

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

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

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

2 голосов
/ 07 апреля 2010

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

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

2 голосов
/ 07 апреля 2010

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

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

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