32-битные и 64-битные системы

49790
Mehper C. Palavuzlar

Каковы различия между 32-битными и 64-битными системами?

Если вы использовали оба из них, какие острые различия вы испытали?

Будет ли проблемой использование 32-битных программ в 64-битных системах в некоторых случаях?

219
Здесь и во многих других случаях возникает путаница между тем, как физическая адресация (доступ к оперативной памяти) влияет на PEA, материнская плата - и логическая адресация (виртуальная память на процесс). В 32-разрядной ОС виртуальная память ограничена 4 ГБ минус то, что резервирует ядро. Он не зависит от ОЗУ, у вас может быть ОЗУ 0,1 МБ или 8 ГБ, и у вас будет ровно 4 ГБ виртуальной памяти (но некоторые зарезервированы ядром). PEA может использоваться, чтобы иметь больше оперативной памяти, но это не идеальный ответ, так как ядро ​​не может получить доступ ко всему этому. ctrl-alt-delor 11 лет назад 0

19 ответов на вопрос

262
Mr Fooz

Примечание. Эти ответы относятся к стандартным процессорам ПК на базе x86 (Intel и AMD) и Windows (как правило, настраиваются для конечных пользователей). Другие 32-разрядные или 64-разрядные микросхемы, другие ОС и другие конфигурации ОС могут иметь различные компромиссы.

С технической точки зрения 64-битная ОС дает вам:

  • Позволяет отдельным процессам обращаться к более чем 4 ГБ ОЗУ каждый (на практике большинство, но не все 32-разрядные ОС также ограничивают общий объем используемой оперативной памяти системы менее 4 ГБ, а не только максимум для каждого приложения).

  • Все указатели занимают 8 байтов вместо 4 байтов. Влияние на использование ОЗУ минимально (поскольку маловероятно, что приложение будет заполнено гигабайтами указателей), но в худшем теоретическом случае это может сделать кэш-память ЦП способной удерживать в 1/2 раза больше указателей (делая это будет эффективно 1/2 размера). Для большинства приложений это не так уж важно.

  • В 64-битном режиме гораздо больше регистров ЦП общего назначения. Регистры являются самой быстрой памятью во всей вашей системе. В 32-битном режиме есть только 8 и 16 регистров общего назначения в 64-битном режиме. В написанных мной приложениях для научных вычислений я наблюдал повышение производительности до 30% за счет перекомпиляции в 64-битном режиме (мое приложение действительно могло использовать дополнительные регистры).

  • Большинство 32-разрядных ОС позволяют отдельным приложениям использовать только 2 ГБ ОЗУ, даже если у вас установлено 4 ГБ. Это связано с тем, что остальные 2 ГБ адресного пространства зарезервированы для обмена данными между приложениями, с ОС и для связи с драйверами. Windows и Linux позволят вам изменить этот компромисс до 3 ГБ для приложений и 1 ГБ для общего доступа, но это может вызвать проблемы для некоторых приложений, которые не ожидают изменений. Я также предполагаю, что это может нанести вред видеокарте с 1 ГБ ОЗУ (но я не уверен). 64-разрядная ОС может дать отдельным 32-разрядным приложениям более полные 4 ГБ для игры.

С точки зрения пользователя:

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

  • Если у вас есть приложения для захвата памяти (например, фоторедакторы, обработка видео, научные вычисления и т. Д.), Если у вас есть (или вы можете купить) более 3 ГБ ОЗУ, и вы можете получить 64-разрядную версию приложения, Выбор прост: используйте 64-битную ОС.

  • Некоторое оборудование не имеет 64-битных драйверов. Проверьте свою материнскую плату, все подключаемые карты и все USB-устройства перед переключением. Обратите внимание, что на заре Windows Vista было много проблем с драйверами. В наши дни все в целом лучше.

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

  • Вы можете запускать 32-битные приложения (но не драйверы) в 64-битной Windows без проблем. Наихудшее замедление, которое я измерил для 32-разрядного приложения в 64-разрядной Windows, составляет около 5% (это означает, что если на выполнение 32-разрядной Windows потребовалось 60 секунд, потребуется не более 60 * 1,05 = 65 секунд с то же самое 32-битное приложение в 64-битной Windows).

Что 32-битный против 64-битный не означает:

В системах x86 32-битные и 64-битные напрямую относятся к размеру указателей. Это все.

  • Это не относится к размеру C intтипа. Это зависит от конкретной реализации компилятора, и большинство популярных компиляторов выбирают 32-битные intв 64-битных системах.

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

  • Он не имеет прямого отношения к размеру шины физического адреса. Например, системе с 64-разрядными строками кэша и максимум 512 ГБ памяти требуется только 33 бита в ее адресной шине (т.е. log2(512*1024**3) - log2(64) = 33).

  • Это не относится к размеру физической шины данных: это больше связано с производственными затратами (количеством контактов в сокете ЦП) и размерами линий кэша.

Очень хороший ответ Тем более, что вы заметили, что на самом деле существует не ограничение в 4 ГБ ОЗУ, а ограничение использования памяти процессом. Просто для вашей информации, я думаю, вы должны взглянуть по этой ссылке: http://www.unawave.de/windows-7-tipps/32-bit-ram-barrier.html?lang=EN Breakthrough 14 лет назад 8
Это приложения, которые не работают в 64-битных окнах: 16-битные приложения / те, которые используют 32-битные или неподписанные драйверы режима ядра. Это много для наркомана, как я ... fluxtendu 14 лет назад 8
@flextendu, учитывая требования к производительности этих старых программ, вы почти наверняка сможете запустить их на виртуальной машине. С помощью проигрывателя VMware, Virtual PC и Virtual Box нет никаких причин не опробовать один из них, если у вас есть лицензия на 32-битную версию Windows. Если вы не хотите возиться с этим, они, вероятно, будут работать и в «режиме Windows XP». Mark Booth 13 лет назад 1
Кстати, 32-разрядные приложения не будут использовать более 2 ГБ ОЗУ, если в их манифесте не указан определенный флаг. Источник: http://blogs.technet.com/b/markrussinovich/archive/2008/11/17/3155406.aspx Hello71 13 лет назад 6
Да, я уверен, что Hello71 натолкнулся на что-то очень важное, что здесь не рассматривается: большинство 32-битных приложений никогда не получат преимущества от дополнительной оперативной памяти. Я думаю, что это стоит упомянуть, нет? Django Reinhardt 13 лет назад 0
@Break, хотя вы должны предупредить людей, прежде чем переходить на сайты с рекламой NSFW. Dan Neely 13 лет назад 0
Хорошее объяснение. 32-битный Linux имеет возможность иметь отдельные приложения с собственным (почти) 4-миллиметровым пространством памяти. Я не думаю, что Windows позволяет это. Rich Homolka 13 лет назад 0
Также стоит упомянуть, что относится к битовому значению. Я слышал аргументы о том, что это размер регистра GP, шина адресации или размер шины данных. jiggunjer 8 лет назад 0
@jiggunjer хорошая идея. Добавлен новый раздел. Mr Fooz 8 лет назад 0
Просто педантичное замечание, чтобы люди не слепо использовали формулу без проверки: 1 / 0.x не равняется 1+ (100-x)% - например, 4 / 0.75 - это не 5 (или 4 + 25%) но 5,333; 60 / 0,95 составляет ~ 63,1579, тогда как 60 + 5% - ровно 63. Banderi 6 лет назад 0
@ Бандери хорошая мысль. Я не помню, были ли реальные цифры 60 против 65 или 60 против 63, поэтому я обновил пост, чтобы предположить, что он наихудший (65), а математика соответствует более стандартным правилам именования. Mr Fooz 6 лет назад 0
Когда некоторые говорят, что 64-битные системы могут обрабатывать данные быстрее, я этого не понимаю. Из того, что я понимаю, если вы находитесь в 32-битной системе, процессор все равно будет загружать страницы памяти (в кэш) с полной шириной шины данных. Учитывая, что ввод-вывод памяти может замедлить работу приложения, разве 32-битные системы не будут немного быстрее? Особенно приложения, которые требуют интенсивного ввода-вывода и не требуют больших вычислительных ресурсов (дополнительные регистры не сильно помогают). Jeach 5 лет назад 0
@Jeach Да, в некоторых случаях 32-разрядные процессы в Intel могут выполняться быстрее, чем 64-разрядные. Если ваше приложение не использует дополнительные регистры, выполняет много погоню за указателями, которая использует большую часть кэша, и / или осуществляет потоковую передачу через тонны машинного кода, тогда 32-разрядный процесс может быть быстрее. Однако для широкого класса приложений дополнительные регистры преодолевают обратную сторону удвоения размера указателей. Как правило, оцените приложение, если вы считаете, что оно будет лучше 32-разрядного. Mr Fooz 5 лет назад 0
107
Brian R. Bondy

В принципе, вы можете сделать все в большем масштабе:

  1. ОЗУ для ОС: ограничение ОЗУ 4 ГБ на платформе x86 для ОС (в большинстве случаев)
  2. ОЗУ на процесс: ограничение ОЗУ 4 ГБ на процессоре x86 для процессов (всегда). Если вы считаете, что это не важно, попробуйте запустить приложение, интенсивно использующее базу данных MSSQL. Он будет использовать более 4 ГБ, если он у вас есть, и работать намного лучше.
  3. Адреса: адреса 64-битные, а не 32-битные, что позволяет вам иметь «большие» программы, которые используют больше памяти.
  4. Дескрипторы, доступные для программ: Вы можете создавать больше файловых дескрипторов, процессов, ... Например, в Windows x64 вы можете создать> 2000 потоков на процесс, но в x86 приблизиться к нескольким сотням.
  5. Доступны более широкие программы: с x64 вы можете запускать как x86, так и x64 программы. (Пример windows: wow64, windows32 на эмуляции windows64)
  6. Варианты эмуляции: с x64 вы можете запускать виртуальные машины x86 и x64.
  7. Быстрее: некоторые вычисления выполняются быстрее на 64-битном процессоре
  8. Разделение нескольких системных ресурсов. Большое количество оперативной памяти очень важно, если вы хотите запустить хотя бы одну виртуальную машину, которая разделяет системные ресурсы.
  9. Доступны эксклюзивные программы: несколько новых программ поддерживают только x64. Пример Exchange 2007.
  10. Будущий устаревший x86 ?: Со временем будет использоваться все больше и больше 64-битных и все больше и больше x86 не будет использоваться. Таким образом, производители будут поддерживать только 64-битные и более.

Два больших типа 64-битных архитектур - это архитектуры x64 и IA64. Но x64 - самый популярный на сегодняшний день.

x64 может выполнять команды x86, а также команды x64. IA64 также выполняет команды x86, но не поддерживает расширения SSE. На Itanium выделено оборудование для запуска инструкций x86; это эмулятор, но аппаратно.

Как упомянул @Phil, вы можете глубже понять, как это работает здесь .

Um. IA64 выполняет команды x86. Это не делает расширения SSE, все же. На Itanium выделено оборудование для запуска инструкций x86; это эмулятор, но аппаратно. tzot 15 лет назад 1
Несколько лет назад Рэймонд Чен написал о «пределе» нити 2000 года, и это более или менее городская легенда: http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx bk1e 15 лет назад 2
Upvote для Arstechnica для их объяснения. Avihu Turzion 14 лет назад 0
RAM limit of 4GB is not quite true (it rather is an artificial limit put on home users Windows systems), check [PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension). With most up-to-date hardware, a Linux PAE kernel (which is what is used by default for 32bit) can address more than 4GB just fine. Same applies to FreeBSD and NetBSD. Izzy 11 лет назад 2
32-разрядные системы не могут использовать более 4 ГБ (1-й пункт) из-за этих «адресов» (3-й пункт). Поскольку наибольшее 32-разрядное число составляет 4,294,967,296 (= 4 ГБ). Так что ваши 1-й и 3-й проколы одинаковы. Вы можете удалить 3-й пункт. :) Jet 10 лет назад 0
x64 и IA64 не являются «** 2 большими типами 64-битных архитектур». Особенно не IA64, не в общем. Архитектуры Sun Microsystem UltraSparc и IBM Power значительно превзошли 64-разрядные по сравнению с архитектурами Intel и AMD и по-прежнему занимают лидирующие позиции в семействах серверных процессоров (на компьютерах Oracle и IBM соответственно). Что касается IA64, он был мертворожденным, потому что никто не может производить достойные компиляторы EPIC, хотя HP некоторое время пыталась использовать Itanium с очень ограниченным успехом. Michael 9 лет назад 0
46

Наибольшее влияние, которое люди заметят в данный момент, заключается в том, что 32-битный ПК может обрабатывать максимум 4 ГБ памяти. Когда вы снимаете память, выделенную для другого использования операционной системой, ваш компьютер, вероятно, будет показывать только около 3,25 ГБ используемой памяти. Перейдите на 64 бита, и этот предел исчезнет.

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

Более подробное описание различий в процессорах можно найти в этой замечательной статье от ArsTechnica .

32-битная платформа и ограничение в 4 ГБ несколько ошибочны и являются (были) в основном архитектурным ограничением выбора / дизайна операционной системы. Действительно, 4 ГБ из 32-битных систем действительно находятся на пределе в пространстве VA процесса. Физический адрес поддерживает 36-битный процессор на 32-битных процессорах Intel. Tall Jeff 15 лет назад 7
Вы делаете хорошее замечание, которое, безусловно, верно. Но влияние в реальном мире пользователей ПК состоит в том, что машина не будет использовать все 4 ГБ, за которые они заплатили. У моего папы была эта проблема, и он все еще не уверен, что 4 ГБ, за которые он заплатил, не могут быть полностью использованы. 15 лет назад 1
Цените вашу точку зрения, но просто пытаясь понять, что исправление не в процессоре или идет в 64-битной среде, это всего лишь вопрос немного улучшенного дизайна ОС. Это решается, например, в корпоративных версиях Windows, даже в 32-разрядных версиях. Это позволяет 64 ГБ оперативной памяти. Tall Jeff 15 лет назад 2
Технически, предел не исчезает. Он перемещается дальше туда, где практически невозможно / невозможно установить столько оперативной памяти на машину в любое время в течение следующего десятилетия или около того. 15 лет назад 0
See my remark on [PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension) above: the 4GB limit is not true for the entire system -- but only applies to single processes (no process can access 4GB and up itself -- but the entire system, i.e. all processes together, can with PAE enabled). So unless one has applications which profit from being able to access 4GB and up (such as video editors/converters with big video files) **and** 8GB+ installed, it shouldn't make much difference whether using 32bit or 64bit. Izzy 11 лет назад 0
31
James

Нет ничего бесплатного: хотя 64-разрядные приложения могут получить доступ к большему объему памяти, чем 32-разрядные, недостатком является то, что им требуется больше памяти. Все те указатели, которые раньше требовали 4 байта, теперь им нужно 8. Например, требование по умолчанию в Emacs на 60% больше памяти, когда он построен для 64-битной архитектуры. Эта дополнительная нагрузка снижает производительность на всех уровнях иерархии памяти: большие исполняемые файлы загружаются с диска дольше, большие рабочие наборы вызывают больше подкачки, а большие объекты означают меньшее размещение в кэшах процессора. Если вы подумаете о ЦП с кешем L1 16 КБ, 32-разрядное приложение может работать с 4096 указателями, прежде чем оно пропустит и перейдет в кэш L2, но 64-разрядное приложение должно достичь кеша L2 после всего лишь 2048 указателей.

На x64 это смягчается другими архитектурными улучшениями, такими как большее количество регистров, но на PowerPC, если ваше приложение не может использовать> 4G, оно может работать быстрее на «ppc», чем «ppc64». Даже на Intel существуют рабочие нагрузки, которые работают быстрее на x86, и немногие работают на 5% быстрее на x64, чем на x86.

Этот ответ предполагает, что PowerPC64 не так хорош, как x86-64. Правда в том, что powerpc64 не улучшил powerpc, так как powerpc не был сломан. ctrl-alt-delor 11 лет назад 2
Linux теперь имеет x32 ABI со всеми преимуществами скорости x86-64 (больше регистров, переработанный ABI), но с 32-битными указателями. +1 за то, что указывает на то, что преимущества 64-битного режима не в фактическом увеличении ширины, а в возможности отбросить большую часть багажа, который сдерживал архитектуру. 64-битные регистры имеют значение для некоторых приложений, но 64-битное пространство указателя требуется реже. Peter Cordes 8 лет назад 3
19
Phoshi

64-битная ОС может использовать больше оперативной памяти. Вот и все, на практике. В 64-битной Vista / 7 используются более совершенные функции безопасности для размещения жизненно важных компонентов в ОЗУ, но это не так «заметно» как таковое.

От ChrisInEdmonton:

32-разрядная операционная система в системе ix86 с PAE может адресовать до 64 ГБ ОЗУ. 64-разрядная операционная система на x86-64 может получить доступ к 256 ТБ виртуального адресного пространства, хотя это может быть увеличено в последующих процессорах, до 16 EB. Обратите внимание, что некоторые операционные системы еще больше ограничивают адресное пространство, и большинство материнских плат будут иметь дополнительные ограничения.

Для ОС 32-разрядный или 64-разрядный относится ТОЛЬКО к размеру указателей (что правильно обсуждается в первом параграфе). -1: некоторые ОС предпочитают фиксировать целочисленный размер по умолчанию для размера указателя, но ни Windows, ни Linux не делают этого. Целочисленная математическая точность неизменна. НИКАКАЯ широко используемая ОС не изменяет точность с плавающей запятой (о чем говорится во втором абзаце). «float» или «single» - 32-разрядные, «double» - 64-разрядные, независимо от того, использует ли ОС 32-разрядные или 64-разрядные указатели. Mr Fooz 14 лет назад 4
Ах, я был явно ошибся, спасибо за разъяснение :) Phoshi 14 лет назад 0
Нет проблем. -1 -> +1 Mr Fooz 14 лет назад 0
Возможно, стоит отредактировать ваш ответ, чтобы указать, сколько оперативной памяти может быть доступно. 32-разрядная операционная система в системе ix86 с PAE может адресовать до 64 ГБ ОЗУ. 64-разрядная операционная система на x86-64 может получить доступ к 256 ТБ виртуального адресного пространства, хотя это может быть увеличено в последующих процессорах, до 16 EB. Обратите внимание, что некоторые операционные системы еще больше ограничивают адресное пространство, и большинство материнских плат будут иметь дополнительные ограничения. ChrisInEdmonton 14 лет назад 0
Я хотел, чтобы все было просто, так как числа * в основном * достаточно высоки, чтобы быть неуместными в данный момент, но не повредит их вставить сейчас. Phoshi 14 лет назад 0
Дело в том, что 32-разрядная операционная система не может одновременно обрабатывать более 4 ГБ, и это обычно составляет 2-3 ГБ на приложение. Это означает, что это может быть полезно для нескольких приложений по 1-1,5G каждое, но иметь проблемы с одним большим. David Thornley 14 лет назад 0
32-битная архитектура IIRC может дать приложению только 2 ГБ, PAE и т. Д. Увеличить его, но оно работает вокруг ограничения архитектуры, поэтому я не буду об этом упоминать. Дело в том, что это хороший момент, но я чувствую, что он подпадает под «использовать больше оперативной памяти», поскольку, как только вы получаете 3 ГБ, вы, вероятно, скоро доберетесь до 64-битной памяти. Phoshi 14 лет назад 0
Почти, но не совсем. 32-битная архитектура может использовать более 2 ГБ на приложение. Однако 32-битная реализация ** windows ** использует старший бит для своего внутреннего содержимого. Это оставляет 31 бит для приложения (2 31 2 ГБ). Hennes 10 лет назад 0
14
Greg Whitfield

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

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

Я думаю, что это проблема реализации, а не дизайна. Т.е. я думаю, что «дизайн», скажем, пакета для редактирования фотографий будет одинаковым независимо от размера слов. Мы пишем код, который компилируется как в 32-битную, так и в 64-битную версии, и дизайн, безусловно, не отличается между ними - это одна и та же кодовая база.

Основное «большое дело» на 64-битной версии - это то, что вы получаете доступ к гораздо большему адресному пространству памяти, чем 32-битная. Это означает, что вы действительно можете использовать более 4 ГБ памяти на вашем компьютере, и это действительно поможет.

Я уверен, что другие ответы будут вдаваться в детали и выгоды больше, чем я.

С точки зрения обнаружения разницы, то программно вы просто проверяете размер указателя (например, sizeof (void *)). Ответ 4 означает 32 бит, а 8 означает, что вы работаете в 64-битной среде.

Если вы пишете программы, которые случайно предполагают, что определенные типы указателей имеют тот же размер, что и определенные целочисленные типы, сделайте это. Это было правдой долгое время. David Thornley 15 лет назад 4
@ Дэвид: Вы абсолютно правы. К сожалению, существует масса кода, который делает именно это. 14 лет назад 0
10
Mecki

32-битный процесс имеет виртуальное адресное пространство 4 ГБ; это может быть слишком мало для некоторых приложений. 64-битное приложение имеет практически неограниченное адресное пространство (конечно, оно ограничено, но вы, скорее всего, не достигнете этого предела).

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

Также вы получаете прирост производительности при работе с переменными "long long int" (64-битные переменные, такие как uint64_t). 32-битный ЦП может добавлять / делить / вычитать / умножать два 64-битных значения, но не в одной аппаратной операции. Вместо этого необходимо разделить эту операцию на две (или более) 32-битные операции. Таким образом, приложение, которое много работает с 64-битными числами, получит прирост скорости благодаря возможности выполнять 64-битную математику непосредственно в аппаратном обеспечении.

И последнее, но не менее важное: архитектура x86-64 предлагает больше регистров, чем классические архитектуры x86. Работа с регистрами намного быстрее, чем работа с ОЗУ, и чем больше регистров у процессора, тем реже ему приходится менять значения регистров в ОЗУ и обратно в регистры.

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

sysctl machdep.cpu.extfeatures 

Если в нем указан EM64T, ваш процессор поддерживает 64-битное адресное пространство в соответствии со стандартом x86-64. Вы также можете искать

sysctl hw.optional.x86_64 

Если он говорит 1 (истина / включен), ваш процессор поддерживает битовый режим x86-64, если он говорит 0 (ложь / отключен), это не так. Если настройка вообще не найдена, считайте ее ложной.

Примечание. Вы также можете извлекать переменные sysctl из нативного приложения C, не используя инструмент командной строки. Увидеть

man 3 sysctl 
ошибка: «machdep.cpu.extfeatures» является неизвестным ключом 14 лет назад 0
Я полагаю, это не называется EM64T, если вам не повезло иметь Intel. 14 лет назад 0
9
Marco van de Voort

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

Некоторые из вещей, упомянутых в этом потоке (например, удвоение # регистров), применимы только к x86-> x86_64, но не к 64-битным в общем. Так же, как тот факт, что под x86_64 гарантированно есть SSE2, 686 кодов операций и дешевый способ сделать PIC. Эти функции строго не о 64-битной, а о сокращении устаревших и устранении известных ограничений x86

Более того, довольно часто люди указывают на удвоение регистров как причину ускорения, в то время как более вероятным является использование SSE2 по умолчанию, которое делает свое дело (ускорение memcpy и подобных функций). Если вы включите тот же набор для x86, разница будет намного меньше. (*) (***)

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

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

В целом, мои простые тесты показывают, что они будут грубо уравновешивать друг друга, если драйверы и библиотеки времени выполнения полностью адаптированы, не давая значительной разницы в скорости для среднего приложения. Однако некоторые приложения могут внезапно работать быстрее (например, в зависимости от AES) или медленнее (критическая структура данных постоянно перемещается / сканируется / обходит и содержит много указателей). Тем не менее, тесты проводились на Windows, поэтому оптимизация PIC не проводилась.

Обратите внимание, что в большинстве языков JIT-VM (Java, .NET) в среднем (внутренне) используется значительно больше указателей, чем, например, в C ++. Вероятно, их использование памяти увеличивается больше, чем для средней программы, но я не смею приравнивать это непосредственно к замедляющим эффектам (так как это действительно сложный и забавный зверь, который часто трудно предсказать без измерения)

(*) малоизвестный факт - число регистров SSE также удваивается в 64-битном режиме

(**) У доктора Доббса была хорошая статья об этом несколько лет назад.

8

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

Взгляните на Том 4, предисловие 1А, чтобы найти примеры классных трюков, о которых я говорю.

7
Kristof Provost

Помимо возможности адресовать больше памяти, x86_64 также имеет больше регистров, позволяющих компилятору генерировать более эффективный код. Улучшение производительности, как правило, будет довольно незначительным.

Архитектура x86_64 обратно совместима с x86. Можно запускать немодифицированные 32-битные операционные системы. Также возможно запускать немодифицированное 32-битное программное обеспечение из 64-битной ОС. Для этого потребуются все обычные 32-битные библиотеки. Возможно, они должны быть установлены отдельно.

Больше регистров и переработанный ABI (передача аргументов функции в регистр) обычно ускоряет на 10-15%, что вполне прилично. Сейчас существует x32 Linux ABI с 32-битными указателями, но с длинным режимом amd64 и соглашениями о вызовах args-in-registers. Таким образом, у вас есть все преимущества скорости по сравнению с amd64, но при этом не требуется 64 бит для каждого указателя. Это хорошо для всего, что не требует> 4 ГБ (виртуальной) памяти. Peter Cordes 8 лет назад 0

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