Raspbian переходит в 64-битный режим

53

На этой странице официальное объявление RPi3 гласит:

Вам понадобится свежее изображение NOOBS или Raspbian со страницы загрузок. При запуске мы используем то же 32-битное пользовательское пространство Raspbian, которое мы используем на других устройствах Raspberry Pi; в течение следующих нескольких месяцев мы рассмотрим, имеет ли смысл переход в 64-битный режим.

Мой вопрос: учитывая, что процессор 64-битный, не очевидно ли, что запуск ОС в 64-битной версии будет лучше во всех отношениях? Чего мне не хватает?

zundi
источник
9
Однажды я работал в компании, которая перенесла программное обеспечение с 32-битной на 64-битную OSF на DEC / Alpha (давно). Просто прямая перекомпиляция, так как кодовая база уже была 64-битной. Увеличение производительности на 10% из-за дополнительного потребления памяти в целых числах и указателях. Это было еще в те дни, когда производительность измерялась в трехзначных мегагерцах и двухзначных (возможно, трехзначных) памяти. Без 4 + ГБ оперативной памяти, не обязательно хорошая идея.
Крис К
6
64-битная первая окупается большим объемом памяти, чем Pi.
Торбьерн Равн Андерсен
2
В системах на базе x86 сложность решить это даже позволила создать гибрид abi: en.wikipedia.org/wiki/X32_ABI, который использует 32-битные указатели и 64-битные регистры процессора.
PlasmaHH
1
@ChrisKaminski, но ARM и x86 разные. Когда они идут от 32 до 64 бит, они удваивают количество регистров и изменяют дизайн некоторых аспектов набора команд, которые в большинстве случаев ускоряют выполнение кода. Вы можете увидеть множество тестов в интернете
phuclv
@rsaxvc так, что это добавляет к моему комментарию? Я сказал «ARM и x86», чтобы сказать, что в этих архитектурах переход на 64 бита повышает производительность приложения в отличие от других архитектур, таких как DEC / Alpha или Sparc, MIPS ...
phuclv

Ответы:

63

учитывая, что процессор 64-битный, не очевидно ли, что запуск ОС в 64-битной версии будет лучше во всех отношениях?

Нет на самом деле, это не так. В некотором смысле, запуск 64-битной операционной системы может ухудшить производительность Raspberry Pi.

Преимущества 64 бит :

Двумя основными преимуществами использования 64-разрядного процессора / операционной системы является то, что устройство может обрабатывать более 4 ГБ ОЗУ и обрабатывать целые числа большего размера, чем 2^32без необходимости использования библиотеки bignum.

Raspberry Pi не имеет более 4 ГБ оперативной памяти. При 1 ГБ ОЗУ вы полностью утратили первое из двух основных преимуществ. Что касается второго преимущества, то какой процент людей фактически использует достаточно гигантские цифры, так что для фонда имеет смысл поддерживать целую вторую операционную систему? Таким образом, RPi может использовать огромные числа с помощью программных методов, но, похоже, если вы собираетесь постоянно находиться в этой области, вам все равно нужно использовать лучшее оборудование.

Проблемы с 64 бит :

Возможность хранить большее количество не предоставляется магией. Скорее, размер объектов памяти должен быть увеличен. В C (и C ++) это означает изменение intна int64_t. Это не делается автоматически, поэтому комментарии о том, что фонд не хочет поддерживать две ветви.

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

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

Также примечание :

То, что вы работаете на 64-битной машине, не означает, что приложение не работает как 32-битное. Windows делает это очень ясно, имея два разных пути установки, C:\Program Filesи C:\Program Files (x86).

Таким образом, фонд, скорее всего, предоставит 64-битную поддержку? :

Мы вернулись к той же точке: «Некоторые люди могут увидеть выгоду, но большинство не увидят». Вы наверняка увидите другие проекты, предлагающие 64-битные сборки, но если фонд не получит много незаслуженного (imo) флекса, они, вероятно, не будут и не должны (imo). Создание и поддержка отдельной 64-битной ветки - это не малое усилие, и, честно говоря, просто оно того не стоит.

Jacobm001
источник
7
Предполагая, что вы говорите о C и друзьях, размер любого типа <= int остается неизменным. size_t и указатели увеличиваются в размере, как это может длиться долго в адресной модели Linux. Вы также полностью упускаете точки виртуального адресного пространства, что имеет значение, когда вы выполняете ввод-вывод с отображением в памяти.
3
Не стоит делать различий между количеством физической памяти и виртуальной памятью. Также не рекомендуется не распространять дезинформацию. sizeof(char)всегда один. Под Linux sizeof(short), sizeof(int), sizeof(float), sizeof(double)не меняются в зависимости от разрядности. Это имеет большое различие в ваших требованиях.
11
У меня проблемы с использованием x64в этом ответе. x64это сокращение от x86-64. Это НЕ синоним слова "64 бит". 64-битные процессоры ARM есть AArch64.
Оли
6
Есть больше 64-битных профи, чем вы перечислили. Есть ли преимущество в производительности для ARM64 , en.wikipedia.org/wiki/64-bit_computing#Pros_and_cons
phuclv
3
Вы пропустили основную причину перехода на 64-битную ОС. 19 января 2038 года. 32-битный Linux не может обрабатывать даты, прошедшие через это время. Исправление было в 64-битной Linux (и обновление любого программного обеспечения на основе 32-битного Unix-времени) в течение достаточно долгого времени. До 2038 года уже 20 лет, но Raspberry Pi, будучи небольшой встраиваемой машиной, имеет потенциал для использования в будущем. Никто не принимал всерьез проблему Y2K в 1980 году.
Стив Сетер
20

Стоит отметить, что ситуация отличается для ARM и Intel / AMD. Это связано с тем, что переход на x86_64 также использовался как возможность обновить устаревшую архитектуру, которая в основном ограничена наличием только 8 регистров общего назначения - и удвоилась в 64-битном режиме. Таким образом, перевод системы Intel / AMD в 64-битный режим также означает использование реальных функций, которые существенно влияют на производительность.

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

(Кроме того, по этой причине была проделана некоторая работа по созданию abi x32 для Intel / AMD Linux , с сохранением улучшений ЦП, но с использованием 32-битных указателей.)

mattdm
источник
5
Хотя AArch32 уже имеет больше регистров, чем x86, AArch64 делает это лучше, потому что теперь есть отдельные SP и ПК. Перед вами не более 14 регистров общего назначения. У вас также есть улучшенный набор инструкций. Есть ли преимущество в производительности для ARM64 , 64-битные инструкции ARM (Aarch64) повышают производительность на 15-30% по сравнению с 32-битными инструкциями ARM (Aarch32)
phuclv
Будет интересно увидеть тесты на Pi3 (особенно с реальными задачами).
Mattdm
6

Я уверен, что уже есть пользователи Debian Aarch64 (ARMv8) на Pi 3; это, конечно, будет не так сложно для многих людей ( см. здесь некоторые подсказки о том, что может сработать) 1, хотя для большинства пользователей это, вероятно, немного натянуто.

Однако, если Raspbian и / или Foundation не выпустят 64-битную версию, вы все чаще будете видеть людей с блогами и т. Д., Объясняющими, как их запускать, и при этом получать нужные вам вкусности.


Сейчас есть релиз Fedora aarch64 для Pi 3.


1. У 32-битных /opt/vcвещей будут некоторые сложности , я не уверен, насколько это преодолимо; Раньше были 32-битные библиотеки совместимости для x86-64, но Aarch64 ... возможно, нет.

Златовласка
источник
1
raspbian.org/RaspbianFAQ#What_is_Raspbian.3F заявляет (говорит о Raspbian): порт необходим, потому что официальный выпуск Debian wheezy armhf совместим только с версиями архитектуры ARM, более поздними, чем версия, используемая в процессорах Raspberry Pi (ARMv7-A) и выше, против процессора Raspberry Pi ARMv6). Это все еще верно с RPi3?
Зунди
@ Санди, я думаю, это 1) Относительно древний; 2) С тех пор запутанный и / или не исправленный, поскольку Debian armhf скомпилирован с hard float, для этого и нужен hf, а есть еще один debian для ARMv4 / 5, который, я думаю, был первым, который использовался на ISA, а ISA не есть жесткие поплавки (я думаю, что ни один не сделал 6 до определенной точки, но так было в течение большей части времени, иначе ARM1176JZ (F) -S). Так что есть только одна версия Raspbian, period, ARMv6 с аппаратной поддержкой плавающей запятой, единственное отличие между моделями A / B / + / 0 и 2 - это используемое ядро, предположительно так же и с 3.
goldilocks
2
... "armel" - это не Debian Debian, который использовался до Raspbian.
Златовласка
@ sandy, что пересылка была написана во времена pi1, поэтому, когда он говорит, что пи, это означает, что мы теперь назвали бы pi1. Есть третьи стороны, выпускающие изображения Debian Armhf для pi2 (и предположительно pi3), но rpf решил пока придерживаться одного изображения для всех плат.
Питер Грин
5

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

Стив Робиллард
источник
Я думал, что код будет таким же, но компилятор будет отвечать за оптимизацию окончательного кода, чтобы воспользоваться преимуществами архитектуры. Это относительно легко сделать новую сборку? Скажем, запустить Debian в 64 битах?
Зунди
@sandy Easy будет зависеть от вашего уровня квалификации и опыта. Какой вариант использования нуждается в этом сейчас?
Стив Робиллард
Ничего особенного, просто стремление максимизировать производительность, на которую способен RPi3.
Зунди
@sandy Фонд заявил, что замена Pi3 не произойдет так быстро, как Pi3 последовал за Pi2 (около 1 года). Они могут использовать переход на 64-битную архитектуру для повышения производительности, не требуя нового оборудования. Обратите внимание, это все мои предположения.
Стив Робиллард
4

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

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

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

Там, где 64-битная версия действительно сияет (если вам не нужны большие числа и числа с плавающей запятой), имеет большее виртуальное адресное пространство:

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

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

Я думаю, что лучшим аргументом для перехода на собственное 64-битное ядро ​​AArch64 является переносимость: основной рабочий стол перешел в основном на 64-битные процессоры, и я вижу больше пакетов, которые предполагают 64-битные, и портировать такой код обратно на 32-битные труднее чем портирование от 32 до 64 бит. В пользовательском пространстве вы можете запускать 32-битные и 64-битные приложения одновременно, при условии, что вы установили многоархивированные библиотеки, поэтому нет необходимости портировать 32-64-битные порты там, где это не так. дело. 64-битная ОС просто предоставит вам более широкий выбор программного обеспечения.

Я не говорю, что производство 64-битного ядра для Raspberry PI 3 легко - есть значительные различия, которые требуют изменений на низком уровне, не все драйверы устройств чистые 64-битные (особенно драйверы для специфичных для ARM графических процессоров). Может быть, Raspberian останется 32-битной ОС, но я считаю, что (в долгосрочной перспективе) она близорука.

Один загрузочный носитель (например, SD-карта) может содержать как 64-, так и 32-разрядные версии ОС, а дополнительное загрузочное программное обеспечение (u-boot, arm-boot и другие) может определить, какой из них загрузить. Более сложная часть - пользовательский интерфейс - файловая система должна быть многоархитивной, даже в 32-битных системах, где 64-битные компоненты бесполезны. Я бы обратился к этому с помощью скрипта или утилиты, которые можно было запустить после начальной загрузки, чтобы удалить ненужные библиотеки и исполняемые файлы программы только на 32-битных системах.

Даниэль Глассер
источник
Возможно, нам нужен x32 ABI для ARM. Тогда у нас могут быть маленькие указатели и все регистры.
rsaxvc
4

64-разрядная адресация может быть полезна, даже если у вас не более 1 ГБ памяти.

Он позволяет вам отображать в памяти большие файлы, поэтому у вас есть указатель, и операционная система позволяет прозрачно выполнять операции ввода-вывода. Просто еще один способ сделать ввод / вывод. Вам нужна 64-битная адресация для больших файлов.

Другой пример, где, как мне кажется, это может быть полезно, - это позволить процессам иметь более 2 ГБ адресного пространства, используя пространство подкачки. Недавно у меня была проблема на 32-битном NAS с большим объемом памяти и поврежденной файловой системой. Процесс fsck исчерпал память, даже с включенными параметрами кэширования. Добавление пространства подкачки не могло решить проблему, 32-разрядное адресное пространство было жестким ограничением. Так что просто не было возможности запустить fsck на этой большой поврежденной файловой системе с 32-битным двоичным файлом. С 64-битным двоичным файлом и некоторым пространством подкачки он бы запустился.

GTC
источник
2

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

  • Когда PHP обрабатывает метки времени Unix, целочисленный размер в 32-битной арке устанавливает верхний предел дат, так что они не могут выходить за пределы определенного дня в 2038 году . Я ожидаю, что это проблема для всех языков, которые обрабатывают метки времени. (К счастью, большинство подсистем обработки дат, которые не используют метки времени Unix, таких как PHP DateTime, специально не предназначены для ограничения этой проблемой даже на старых процессорах).
  • Mongo ограничен базами данных размером менее 2G для этой арки, и 32-разрядные сборки скоро будут устаревшими. Из руководства :

    Начиная с MongoDB 3.2, 32-разрядные двоичные файлы устарели и будут недоступны в будущих выпусках.

    Хотя 32-разрядные сборки существуют для Linux и Windows, они не подходят для производственных развертываний. 32-разрядные сборки также не поддерживают механизм хранения WiredTiger.

halfer
источник
Странно, это зависит от вашей платформы. Обычно это не целочисленный размер, а размер time_t в библиотеке 'C'. Даже на 32-битных платформах можно использовать 64-битный time_t с некоторой нагрузкой на процессорное время, но многие 32-битные платформы еще не делают этого, так как при этом возникает проблема двоичной совместимости.
rsaxvc
@rsaxvc, интересно, спасибо. Так мог бы я получить 64-битную обработку времени, перекомпилировав PHP, или это потребовало бы модификации базовых библиотек C? Первое было бы в моих силах, но я не был уверен в последнем - я размышлял о перекомпиляции всего Ras [самого себя], но, похоже, нет простых инструкций для этого (пока, во всяком случае).
Половник
для Linux вам нужно будет исправить ядро, libc и ваше приложение. Это, вероятно, не стоит того. После некоторого чтения OpenBSD (no on RPi) time_t является 64-битным с 5.5. В 32-битной Windows, использующей Visual Studio 2005 или новее, time_t является 64-битным.
rsaxvc
@rsaxvc: хорошо, спасибо. Интересно, имеет ли смысл для меня ждать появления 64-битной ОС - это звучало неизбежно в нескольких новостных статьях, опубликованных несколько месяцев назад ....:-)
Половник
-4

Мои мысли по этому поводу: хотя я не знаю точно, как процессор ARM обращается к памяти, я могу сказать вам это по предыдущим архитектурам с несколькими ЦП, которые я запрограммировал (SPARC / Alpha / i386 / AMD64 / X86_64): при использовании общей памяти и адресации с помощью своего «реального» указателя виртуального адреса переход на 64-битную систему не является тривиальным. Хотя memcpy делает то, что должен, вы должны принять во внимание, что в 64 битах данные хранятся примерно так (бит назад):

HGFEDCBA
HGFEDCBA
HGFEDCBA

все же в 32 битах это выглядит так:

ABCD
ABCD
ABCD

Итак, в 32 битах, когда вы сохраняете, скажем, JPEG в оперативной памяти, вы можете читать байты заголовка или выполнять обнаружение фронта без каких-либо проблем линейным образом * скажем, переходя от байта к байту вперед. Но в 64-битной архитектуре это меняется:

32bit:

for (i=0; i< img_length/4; i++) 
{ 
    address=shm_start+i; 
    for (c=0; c< 4; c++) 
    { 
        byte=((*address >> c) & 15) 
    } 
}

64bit:

for (i=-; i< img_length/8; i++) 
{ 
    address=shm_start+i; 
    for (c=7; c>=0; c--) 
    { 
        byte=((*address >> c) & 15) 
    } 
}
bobx
источник
5
Endianness не имеет ничего общего с размером слова. Черт, многие архитектуры позволяют программисту выбирать порядок байтов, включая ARM! Кроме того, «64-разрядный» может иметь совершенно разные последствия в зависимости от рассматриваемой архитектуры, и его трудно сравнивать между архитектурами или пытаться провести сходство между ними.
Боб
1
Я не думаю, что я = - является действительным.
rsaxvc