64-битные программы больше и быстрее, чем 32-битные версии?
Я полагаю, что я фокусируюсь на x86, но я вообще заинтересован в переходе от 32 до 64 бит.
логически я вижу, что константы и указатели в некоторых случаях будут больше, поэтому программы, вероятно, будут больше. И желание выделить память на границах слов для эффективности означало бы больше пробелов между выделениями.
Я также слышал, что 32-битный режим на x86 должен очистить свой кэш при переключении контекста из-за возможного перекрытия 4G адресное пространство.
Итак, каковы реальные преимущества 64 бит?
и в качестве дополнительного вопроса, будет ли 128 бит еще лучше?
Edit:
Я только что написал свою первую 32/64 битную программу. Он делает связанные списки / деревья объектов 16 байт (версия 32b) или 32 байт (версия 64b) и делает много печати на stderr - не очень полезная программа, и не что-то типичное, но это мой первый.
размер: 81128(32b) v 83672 (64b) - так не большая разница
скорость: 17s (32b) v 24s(64b) - работает на 32-битной ОС (OS-X 10.5.8)
обновление:
Я отмечаю, что разрабатывается новый гибридный x32 ABI (двоичный интерфейс приложения), который является 64b, но использует указатели 32b. Для некоторых тестов это приводит к меньшему коду и более быстрому выполнению, чем 32b или 64b.
8 ответов:
Если вам не нужно получить доступ к большему количеству памяти, что адресация 32b позволит вам, преимущества будут небольшими, если таковые имеются.
при работе на 64b CPU вы получаете тот же интерфейс памяти, независимо от того, используете ли вы код 32b или 64b (вы используете тот же кэш и ту же шину).
в то время как архитектура x64 имеет еще несколько регистров, что позволяет упростить оптимизацию, этому часто противодействует тот факт, что указатели теперь больше и использование любых структур с указателями приводит к более высокий трафик памяти. Я бы оценил увеличение общего использования памяти для приложения 64b по сравнению с 32b, чтобы быть около 15-30 %.
Я обычно вижу 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), могут быть разными, конечно.
независимо от преимуществ, я бы предложил вам всегда компилировать свою программу для размера слова по умолчанию системы (32-бит или 64-бит), так как если вы компилируете библиотеку как 32-битный двоичный файл и предоставляете его в 64-битной системе, вы заставите всех, кто хочет связать с вашей библиотекой, предоставить свою библиотеку (и любые другие зависимости библиотеки) как 32-битный двоичный файл, когда 64-битная версия доступна по умолчанию. Это может быть довольно неприятно для всех. Если вы сомневаетесь, предоставьте версии вашей библиотеки.
Что касается практических преимуществ 64-разрядной версии... наиболее очевидным является то, что вы получаете большее адресное пространство, поэтому, если mmap файл, вы можете адресовать больше его сразу (и загружать большие файлы в память). Еще одно преимущество заключается в том, что, если компилятор выполняет хорошую работу по оптимизации, многие из ваших арифметических операций могут быть распараллелены (например, размещение двух пар 32-разрядных чисел в двух регистрах и выполнение двух добавлений в одной операции добавления), и большое число вычисления будут выполняться быстрее. Тем не менее, вся 64-битная и 32-битная вещь вообще не поможет вам с асимптотической сложностью, поэтому, если вы хотите оптимизировать свой код, вы, вероятно, должны смотреть на алгоритмы, а не на постоянные факторы, подобные этому.
EDIT:
Пожалуйста, не обращайте внимания на мое заявление о параллельном сложении. Это не выполняется обычным оператором add... Я путал это с некоторыми из векторизованных/SSE инструкции. Более точное преимущество, помимо большего адресного пространства, заключается в том, что существует больше регистров общего назначения, что означает, что в файле регистра CPU можно поддерживать больше локальных переменных, что намного быстрее для доступа, чем если бы вы помещали переменные в стек программы (что обычно означает выход в кэш L1).
в дополнение к наличию большего количества регистров, 64-бит имеет SSE2 по умолчанию. Это означает, что вы действительно можете выполнять некоторые вычисления параллельно. У расширений SSE были и другие лакомства. Но я думаю, что главное преимущество заключается в том, чтобы не проверять наличие расширений. Если это x64, у него есть SSE2. ...Если мне не изменяет память.
в конкретном случае от x68 до x68_64 64-битная программа будет примерно такого же размера, если не немного меньше, использовать немного больше памяти и работать быстрее. В основном это связано с тем, что x86_64 имеет не только 64-битные регистры, но и в два раза больше. x86 не имеет достаточного количества регистров, чтобы сделать скомпилированные языки настолько эффективными, насколько это возможно, поэтому код x86 тратит много инструкций и пропускную способность памяти, перемещая данные между регистрами и памятью. архитектуру x86_64 имеет гораздо меньше это, и поэтому он занимает немного меньше места и работает быстрее. Инструкции с плавающей запятой и битовые векторные инструкции также намного эффективнее в x86_64.
в целом, однако, 64-битный код не обязательно быстрее и обычно больше, как для кода, так и для использования памяти во время выполнения.
только оправдание для перемещения вашего приложения на 64 бит необходимо для большего объема памяти в приложениях, таких как большие базы данных или ERP-приложений с по крайней мере 100s одновременных пользователей, где 2 ГБ предел будет превышен довольно быстро, когда приложения кэшируются для повышения производительности. Это случай специально на ОС Windows, где integer и long по-прежнему 32 бит (у них есть новая переменная _int64. Только указатели 64-битные. На самом деле WOW64 сильно оптимизирован на Windows x64, так что 32-битные приложения работают с низким штрафом на 64-битной ОС Windows. Мой опыт работы на Windows x64-это 32-разрядная версия приложения, работающая на 10-15% быстрее, чем 64-разрядная, поскольку в первом случае, по крайней мере, для проприетарных баз данных памяти вы можете использовать указатель арифметический для поддержания b-дерева (наиболее интенсивная часть процессоров систем баз данных). Компуатация интенсивные приложения, которые требуют больших десятичных знаков для высокой точности не обеспечивается двойной на 32-64 бит операционной системы. Эти приложения могут использовать _int64 in natively вместо программная эмуляция. Конечно, большие дисковые базы данных также покажут улучшение по сравнению с 32 битами просто из-за возможности использовать большую память для кэширования планов запросов и так далее.
больше данных передается между процессором и ОЗУ для каждой выборки памяти (64 бит вместо 32), поэтому 64-разрядные программы могут быть быстрее, если они написаны так, чтобы они правильно воспользовались этим.
любые приложения, требующие использования ЦП, такие как транскодирование, производительность отображения и рендеринг мультимедиа, будь то аудио или визуальный, безусловно, потребуют (на данный момент) и выиграют от использования 64 бит против 32 бит из-за способности ЦП справляться с огромным количеством данных, которые бросаются на него. Это не столько вопрос адресного пространства, сколько то, как обрабатываются данные. 64-битный процессор, учитывая 64-битный код, будет работать лучше, особенно с математически сложные вещи, такие как транскодирование и VoIP - данные-на самом деле, любые "математические" приложения должны извлечь выгоду из использования 64-битных процессоров и операционных систем. Докажи, что я ошибаюсь.