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

StackOverflow https://stackoverflow.com/questions/2378399

Вопрос

Я полагаю, я сосредоточусь на X86, но я обычно заинтересован в шаге от 32 до 64 бита.

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

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

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

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

Редактировать:

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

Size: 81128 (32b) V 83672 (64b) - поэтому не большая разница

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

Обновлять:

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

В конкретном случае X68 до X68_64 64-битная программа будет примерно такого же размера, если не слегка меньше, используйте немного больше памяти и запустите быстрее. В основном это потому, что X86_64 не просто имеет 64-битные реестры, он также имеет в два раза больше. X86 не имеет достаточного количества регистров для создания компиляционных языков как можно эффективнее, так как они могли бы быть, поэтому код X86 тратит много инструкций и пропускной способности памяти, переключающие данные и далее между регистрами и памятью. X86_64 имеет гораздо меньше этого, и поэтому требуется немного меньше места и проходит быстрее. Плавающие точка и бит-Twiddling векторные инструкции также намного эффективнее в X86_64.

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

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

Я кодирую шахматный двигатель. Извлечение лучшего перемещения с использованием поиска деревьев на основе MiniMax на глубину 9 (из определенного положения) заняла ~ 17,0 на конфигурации Win32 и после переключения на X64 теперь требуется ~ 10,3 с. Это 41% ускорения!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top