Действительно ли 64 битных программы больше и быстрее, чем версии на 32 бита?

Я предполагаю, что фокусируюсь на x86, но я обычно интересуюсь перемещением от 32 до 64 битов.

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

Я также услышал, что режим на 32 бита на x86 должен сбросить свой кэш когда контекстное переключение из-за возможных перекрывающихся адресных пространств 4G.

Так, какова реальная выгода 64 битов?

И как дополнительный вопрос, 128 битов были бы еще лучше?

Править:

Я только что записал свою первую 32/64 битную программу. Это делает связанные списки/деревья 16 байтов (32b версия) или 32 байтов (64b версия) объектами и делает большую печать к stderr - не действительно полезная программа и не что-то типичное, но это - мое первое.

Размер: 81128 (32b) v 83672 (64b) - так не много различия

Скорость: 17 (32b) v 24 (64b) - работа ОС на 32 бита (OS X 10.5.8)

Обновление:

Я отмечаю, что новый гибрид (двоичный интерфейс приложений) x32 ABI разрабатывается, который 64b, но использует 32b указатели. Для некоторых тестов это приводит к меньшему коду и более быстрому выполнению или, чем 32b или, чем 64b.

https://sites.google.com/site/x32abi/

77
задан philcolbourn 11 May 2012 в 11:16
поделиться

5 ответов

Если вам не нужно обращаться к большему объему памяти, чем позволяет 32b адресация, преимущества будут незначительными, если вообще будут.

При работе на 64b CPU вы получаете одинаковый интерфейс памяти независимо от того, выполняете ли вы 32b или 64b код (вы используете один и тот же кэш и одну и ту же шину).

Хотя архитектура x64 имеет несколько больше регистров, что позволяет легче проводить оптимизацию, это часто компенсируется тем, что указатели стали больше, и использование любых структур с указателями приводит к увеличению трафика памяти. Я бы оценил увеличение общего использования памяти для 64b приложения по сравнению с 32b примерно в 15-30 %.

29
ответ дан 24 November 2019 в 11:00
поделиться

Я обычно вижу 30% -ное улучшение скорости для кода с интенсивными вычислениями на x86-64 по сравнению с x86. Скорее всего, это связано с тем, что у нас есть 16 x 64-битных регистров общего назначения и 16 x SSE-регистров вместо 8 x 32-битных регистров общего назначения и 8 x SSE-регистров. Это с компилятором Intel ICC (11.1) на x86-64 Linux - результаты с другими компиляторами (например, gcc) или с другими операционными системами (например, Windows), конечно, могут отличаться.

40
ответ дан 24 November 2019 в 11:00
поделиться

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

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

РЕДАКТИРОВАТЬ :
Не обращайте внимания на мое утверждение о параллельном сложении. Это не выполняется обычным оператором добавления ... Я запутал это с некоторыми из векторизованных инструкций / SSE.Более точным преимуществом, помимо большего адресного пространства, является наличие регистров общего назначения, что означает, что в файле регистров ЦП можно поддерживать большее количество локальных переменных, доступ к которому осуществляется намного быстрее, чем если бы вы поместили переменные в программный стек (что обычно означает выход в кеш L1).

15
ответ дан 24 November 2019 в 11:00
поделиться

Больше данных передается между ЦП и ОЗУ при каждой выборке из памяти (64 бита вместо 32), поэтому 64-битные программы могут быть быстрее, если они написаны так, чтобы правильно использовать это преимущество.

1
ответ дан 24 November 2019 в 11:00
поделиться

В конкретном случае от x68 до x68_64 64-битная программа будет примерно того же размера, если не немного меньше, будет использовать немного больше памяти и работать быстрее. В основном это связано с тем, что x86_64 имеет не только 64-битные регистры, но и вдвое больше. x86 не имеет достаточно регистров, чтобы сделать компилируемые языки настолько эффективными, насколько они могли бы быть, поэтому код x86 тратит много инструкций и пропускную способность памяти, перемещая данные туда и обратно между регистрами и памятью. В x86_64 этого гораздо меньше, поэтому он занимает немного меньше места и работает быстрее. Инструкции с плавающей запятой и векторные инструкции битового вращения также намного более эффективны в x86_64.

В целом, однако, 64-битный код не обязательно быстрее и обычно больше, как для кода, так и для использования памяти во время выполнения.

1
ответ дан 24 November 2019 в 11:00
поделиться
Другие вопросы по тегам:

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