64-разрядные программы больше и быстрее, чем 32-разрядные версии?

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

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

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

Итак, каковы реальные преимущества 64-битного?

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

Edit:

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

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

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

Update:

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

ИЗМЕНИТЬ:
Пожалуйста, не обращайте внимания на мое выражение о параллельном добавлении. Это не выполняется обычным оператором add... Я сбивал с толку то, что с некоторыми из векторизованных /SSE инструкций. Более точная выгода, помимо большего адресного пространства, заключается в том, что существуют более общие регистры общего назначения, что означает, что в файле регистров CPU может храниться больше локальных переменных, что намного быстрее для доступа, чем если вы поместите переменные в (что обычно означает выход в кеш L1).

Ответ 4

В дополнение к наличию большего количества регистров, по умолчанию 64-бит имеет SSE2. Это означает, что вы действительно можете выполнить некоторые вычисления параллельно. У расширений SSE были и другие лакомства. Но я полагаю, что главное преимущество - не проверять наличие расширений. Если он имеет x64, он имеет SSE2.... Если моя память служит мне правильно.

Ответ 5

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

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

Ответ 6

Единственное обоснование для перемещения вашего приложения на 64-разрядный бит - это потребность в большей памяти в таких приложениях, как большие базы данных или приложения ERP с не менее чем 100 одновременными пользователями, где ограничение 2 ГБ будет достаточно быстро превышено, если кэш приложений будет лучше работать. Это особенно характерно для ОС Windows, где целое и длинное все еще 32 бит (у них есть новая переменная _int64. Только указатели - 64 бит. Фактически WOW64 сильно оптимизирован в Windows x64, так что 32-разрядные приложения работают с низким штрафом на 64-битных Windows OS. Мой опыт работы с Windows x64 - это 32-разрядная версия приложения, работающая на 10-15% быстрее, чем 64-битная, поскольку в первом случае, по крайней мере, для запатентованных баз данных памяти вы можете использовать арифметический указатель для поддержки b-дерева (большая часть процессорной части систем баз данных) Интенсивные приложения, требующие больших десятичных знаков для максимальной точности, которые не могут быть удвоены на 32-64-битной операционной системе. Эти приложения могут использовать _int64 вместо исходной эмуляции программного обеспечения. Конечно, на больших дисковых базах также будет улучшено более 32 бит, к возможности использовать большую память для кэширования планов запросов и т.д.

Ответ 7

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

Ответ 8

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