Raspbian mudando para o modo de 64 bits

52

Em desta página , o anúncio oficial RPi3 afirma:

Você precisará de uma imagem NOOBS ou Raspbian recente em nossa página de downloads. No lançamento, estamos usando a mesma área de usuário Raspbian de 32 bits que usamos em outros dispositivos Raspberry Pi; nos próximos meses, investigaremos se há valor em mudar para o modo de 64 bits.

Minha pergunta é, dado que o processador é de 64 bits, não é óbvio que rodar o sistema operacional em 64 bits será melhor em todos os aspectos? o que estou perdendo?

zundi
fonte
9
Certa vez, trabalhei para uma empresa que portava software de 32 bits para 64 bits OSF no DEC / Alpha (há muito tempo). Apenas uma recompilação direta, já que a base de código já era compatível com 64 bits. Desempenho de 10% atingido pelo consumo extra de memória em números inteiros e ponteiros. Isso foi nos dias em que o desempenho era medido em três dígitos em mhz e em memórias de dois dígitos (talvez três baixos). Sem ter 4 GB de RAM a bordo, não é necessariamente uma boa ideia.
Chris K
6
O primeiro de 64 bits compensa com mais memória do que o Pi.
Thorbjørn Ravn Andersen
2
Em sistemas baseados em x86, a dificuldade de decidir isso até deixou um híbrido abi: en.wikipedia.org/wiki/X32_ABI, que usa ponteiros de 32 bits e registradores de 64 bits da CPU.
PlasmaHH
11
@ChrisKaminski, mas ARM e x86 são diferentes. Quando passam de 32 para 64 bits, duplicam o número de registradores e reprojetam alguns aspectos do conjunto de instruções que tornam o código mais rápido na maioria dos casos. Você pode ver um monte de referências na internet
phuclv
@rsaxvc então o que isso acrescenta ao meu comentário? Eu disse "ARM e x86" para dizer que nessas arquiteturas que vão de 64 bits melhora o desempenho da aplicação ao contrário de outras arquiteturas como DEC / Alpha ou Sparc, MIPS ...
phuclv

Respostas:

62

dado que o processador é de 64 bits, não é óbvio que rodar o sistema operacional em 64 bits será melhor em todos os aspectos?

Não, na verdade não é. De certa forma, a execução de um sistema operacional de 64 bits pode deteriorar o desempenho do Raspberry Pi.

Benefícios de 64 bits :

Os dois principais benefícios do uso de um processador / sistema operacional de 64 bits é que o dispositivo pode lidar com mais de 4 GB de RAM e lidar com números inteiros maiores do que 2^32sem a necessidade de uma biblioteca de bignum.

O Raspberry Pi não possui mais de 4 GB de RAM. Com 1 GB de RAM, você perdeu completamente o primeiro dos dois principais benefícios. Quanto ao segundo benefício, que porcentagem de pessoas está realmente usando números gigantes suficientes para fazer sentido para a fundação suportar um segundo sistema operacional inteiro? Como é, o RPi pode usar grandes números por meio de métodos de software, mas parece que se você estiver consistentemente nesse domínio, precisará usar um hardware melhor de qualquer maneira.

Problemas com 64 bits :

A capacidade de armazenar um número maior não é garantida por mágica. Em vez disso, o tamanho dos objetos de memória precisa ser aumentado. Em C (e C ++), isso significa alterar um intpara int64_t. Isso não é feito automaticamente, portanto, os comentários sobre a fundação não desejam manter dois ramos.

Além disso, muitos aplicativos simplesmente não fornecem um benefício (para a maioria dos usuários) quando executados no modo de 64 bits. Observe que a maioria dos navegadores da Web, o MS Office e toda uma série de outros softwares populares ainda são enviados e mantidos de maneira 32 bits. Claro que você pode obter uma versão de 64 bits do MS Office, mas ela raramente é usada.

Se o aplicativo / sistema operacional for gravado para tirar proveito de uma arquitetura de 64 bits, seu aplicativo usará mais memória, simplesmente porque variáveis ​​e ponteiros estão ocupando mais espaço. Geralmente, essa é uma troca relativamente pequena de máquinas que se beneficiarão das vantagens. No nosso caso, temos muito poucas vantagens e muito pouca RAM.

Também de nota :

Só porque você está executando em uma máquina de 64 bits, não significa que o aplicativo não esteja executando em 32 bits. O Windows deixa isso bem claro, com dois caminhos de instalação diferentes, C:\Program Filese C:\Program Files (x86).

Então, a fundação provavelmente fornecerá suporte de 64 bits? :

Estamos de volta ao mesmo ponto de "Algumas pessoas podem ver benefícios, mas a maioria não vê". Você certamente verá outros projetos que oferecem compilações de 64 bits, mas, a menos que a fundação receba muito (imo) flack imerecido, eles provavelmente não irão e não devem (imo). Criar e manter um ramo separado de 64 bits não é um empreendimento pequeno e, honestamente, simplesmente não parece valer a pena.

Jacobm001
fonte
7
Supondo que você fale sobre C e amigos, o tamanho de qualquer tipo <= int permanece o mesmo. size_t e ponteiros aumentam de tamanho, conforme o modelo de endereço do Linux. Você também perde completamente os pontos do espaço de endereço virtual, o que importa quando você faz a E / S mapeada na memória.
3
Não é avançado fazer uma distinção entre quantidades de memória física e memória virtual. Também não é avançado para não propagar informações erradas. sizeof(char)é sempre um. No Linux, sizeof(short), sizeof(int), sizeof(float), sizeof(double)não variam com o número de bits. Isso tem uma grande diferença em suas reivindicações.
11
Estou com problemas com o uso x64desta resposta. x64é uma abreviação de x86-64. NÃO é sinônimo de "64 bits". As CPUs ARM de 64 bits são AArch64.
1111 Oli
6
Existem mais profissionais de 64 bits que você listou. Existe vantagem de desempenho para ARM64 , en.wikipedia.org/wiki/64-bit_computing#Pros_and_cons
phuclv
3
Você perdeu o maior motivo para mudar para um sistema operacional de 64 bits. 19 de janeiro de 2038. O Linux de 32 bits não pode lidar com datas passadas dessa vez. A correção foi no Linux de 64 bits (e atualizou qualquer software com base no tempo unix de 32 bits) por algum tempo. 2038 é daqui a 20 anos, mas o Raspberry Pi, sendo uma pequena máquina embarcada, tem algum potencial para ser usado até agora no futuro. Ninguém levou realmente a sério o problema do ano 2000 em 1980.
Steve Sether
19

Vale ressaltar que a situação é diferente para ARM e Intel / AMD. Isso ocorre porque a mudança para x86_64 também foi usada como uma oportunidade para atualizar a arquitetura antiga, basicamente prejudicada por ter apenas 8 registros de uso geral - e dobrou no modo de 64 bits. Portanto, mudar um sistema Intel / AMD para o modo de 64 bits também significa ativar recursos reais que fazem uma diferença significativa no desempenho.

O ARM não tem esse problema (embora o AArch64 adicione registradores, as arquiteturas de 32 bits não estavam famintas por eles), então os benefícios são basicamente mais memória endereçável diretamente e suporte inteiro grande nativo - muito menos negócio, e talvez neutralizado pela desvantagem (mais memória usada para tudo).

(Por outro lado, por esse motivo, houve algum trabalho na criação de uma abi "x32" para Intel / AMD Linux , mantendo os aprimoramentos da CPU, mas usando ponteiros de 32 bits.)

mattdm
fonte
5
Embora o AArch32 já tenha mais registros que o x86, o AArch64 faz isso melhor porque agora existem SP e PC separados. Antes de você ter no máximo 14 registros de uso geral. Você também tem um conjunto de instruções melhor concebido Existe vantagem de desempenho para ARM64 , 64-bit ARM (Aarch64) Instruções aumentar o desempenho em 15 a 30% em comparação com 32-bit ARM (Aarch32) Instruções
phuclv
Será interessante ver referências no Pi3 (principalmente em tarefas do mundo real).
mattdm
6

Tenho certeza de que já existem pessoas executando o Debian Aarch64 (ARMv8) no Pi 3; certamente não seria tão difícil para muitas pessoas ( veja aqui algumas dicas sobre o que pode funcionar) 1, embora para a maioria dos usuários seja provavelmente um pouco exagerado.

No entanto, se o Raspbian e / ou a Foundation não lançarem uma versão de 64 bits, você verá cada vez mais pessoas com blogs etc., explicando como executar um e ainda obter os presentes necessários.


Agora existe uma versão do Fedora aarch64 para o Pi 3.


1. Haverá algumas complicações com o /opt/vcmaterial de 32 bits , não tenho certeza do quanto isso é superável; costumava haver bibliotecas compatíveis de 32 bits para x86-64, mas Aarch64 ... talvez não.

Cachinhos Dourados
fonte
11
raspbian.org/RaspbianFAQ#What_is_Raspbian.3F declara (falando sobre Raspbian): A porta é necessária porque o lançamento oficial do Debian wheezy armhf é compatível apenas com versões da arquitetura ARM posteriores à usada no Raspberry Pi (CPUs ARMv7-A e superior, versus a CPU ARMv6 do Raspberry Pi). Isso ainda é verdade com o RPi3?
Zundi 11/03/16
@ Sandy eu acho que é 1) relativamente antigo; 2) Confusos e / ou não corrigidos desde então, como o Debian armhf é compilado com hard float, é para isso que serve o hf, em comparação com outro debian para o ARMv4 / 5 que eu acho que foi o primeiro usado no ISA e que o ISA não o fez. tem flutuadores rígidos (acho que nem o 6 foi até um certo ponto, mas tem sido assim na maior parte do tempo, também conhecido como ARM1176JZ (F) -S). Portanto, existe apenas uma versão do Raspbian, período, o ARMv6 com suporte a ponto flutuante de hardware, a única diferença entre os modelos A / B / + / 0 e o 2 é o kernel usado, provavelmente também com o 3.
goldilocks
2
... "armel" é o Debian não hf usado antes do Raspbian.
goldilocks
@ sandy que sentance foi escrita nos dias do pi1, então quando diz pi significa o que chamaríamos de pi1. Existem terceiros liberando imagens debian armhf para o pi2 (e presumivelmente pi3), mas o rpf decidiu ficar com uma imagem para todas as placas no momento.
Peter Green
5

Como parte da publicidade de lançamento, mencionei que uma preocupação é o esforço necessário para manter duas bases de código separadas (32 e 64 bits). o vídeo Adafruit PI3 Launch também mencionou que a mudança para um processador de 64 bits foi mais sobre a velocidade do clock que o novo chip fornecido do que sobre o modo de 64 bits.

Steve Robillard
fonte
Eu pensei que o código seria o mesmo, mas o compilador seria responsável por otimizar o código final para tirar proveito da arquitetura. É relativamente fácil criar uma nova compilação? Digamos, para rodar o Debian em 64 bits?
zundi 11/03/16
@sandy Easy dependeria do seu nível de habilidade e experiência. Qual é o caso de uso que precisa disso agora?
9788 Steve Rogillard
Nenhum em particular, apenas querendo maximizar o desempenho que o RPi3 é capaz.
zundi 11/03/16
@sandy A fundação afirmou que a substituição do Pi3 não ocorrerá tão rapidamente quanto o Pi3 seguiu o Pi2 (aproximadamente 1 ano). Eles podem usar o switch para 64 bits para obter uma melhora no desempenho sem a necessidade de um novo hardware - observe que tudo isso é especulação da minha parte.
9186 Steve Robillard
4

O endereçamento de 64 bits pode ser útil mesmo se você não tiver mais de 1 GB de memória.

Permite mapear arquivos grandes na memória, para que você tenha um ponteiro e deixe o sistema operacional executar a E / S de forma transparente. Apenas outra maneira de fazer E / S. Você precisa de um endereçamento de 64 bits para fazer isso em arquivos grandes.

Outro exemplo em que vejo que pode ser útil é permitir que os processos tenham mais de 2 GB de espaço de endereço, usando espaço de troca. Recentemente, tive um problema em um NAS de 32 bits com muito armazenamento e um sistema de arquivos danificado. O processo fsck ficou sem memória, mesmo com as opções de cache ativadas. A adição de espaço de troca não conseguiu resolver o problema; o espaço de endereço de 32 bits era o limite rígido lá. Portanto, não havia como executar o fsck neste grande sistema de arquivos danificado com um binário de 32 bits. Com um binário de 64 bits e algum espaço de troca, ele seria executado.

GTC
fonte
3

Dirigindo-me à afirmação de que os programas nativos de 64 bits são maiores (mais memória para dados e ponteiros) e que não há benefícios perceptíveis para um SO de 64 x 32 bits no ARMv8 com menos de 4 GB de RAM, desejo aumentar alguns pontos.

Existem algumas diferenças significativas na maneira como as coisas são feitas no ARMv7 (e antes) e no ARMv8, arquitetonicamente, que tornam a execução do ARMv8 mais eficiente. Parte disso é proveniente dos caminhos de dados internos mais amplos, parte é a eliminação de casos especiais e um pipeline muito mais profundo). Essas mesmas alterações tornam o ARMv8 melhor na execução do código ARMv7 (32 bits).

Os aplicativos nativos de 64 bits usam ponteiros de 64 bits e 'size_t' é de 64 bits; portanto, os elementos que os utilizam ficam maiores. O restante dos dados tenderá a permanecer do mesmo tamanho. O significado disso é menor, no entanto, para o tamanho das imagens executáveis.

Onde o nativo de 64 bits realmente brilha (se você não se importa com grandes números inteiros e com ponto flutuante) está tendo um espaço de endereço virtual maior:

  • O sistema operacional é capaz de dividir o espaço de endereço virtual em seções cada vez maiores, permitindo um gerenciamento mais fácil de recursos compartilhados, alternâncias de contexto mais simplificadas entre diferentes níveis de privilégios e assim por diante.
  • Se você ativou a troca, pode executar processos cada vez maiores, excedendo os limites de memória física (isso também é verdade em 32 bits, mas você é menos limitado em 64 bits)

Se o SO atualmente tira vantagem disso ou não, isso fará a diferença à medida que o mainstream se afasta dos 32 bits.

Eu acho que o melhor argumento para mudar para um kernel AArch64 nativo de 64 bits é a portabilidade: a área de trabalho principal mudou-se para processadores principalmente de 64 bits, e estou vendo mais pacotes que assumem 64 bits e é mais difícil portar esse código de volta para 32 bits. do que portar de 32 a 64 bits. No espaço do usuário, você pode executar aplicativos de 32 bits e aplicativos de 64 bits lado a lado, supondo que você tenha instalado as bibliotecas de vários arcos; portanto, não é necessário portar de 32 a 64 bits, caso contrário importam. Um sistema operacional de 64 bits simplesmente oferece uma seleção maior de software.

Não estou dizendo que produzir um kernel de 64 bits para o Raspberry PI 3 é fácil - existem diferenças significativas que exigem alterações em um nível baixo, nem todos os drivers de dispositivo estão limpos em 64 bits (especialmente drivers para GPUs específicas para ARM). Pode ser que o Raspberian continue sendo um sistema operacional de 32 bits, mas acredito que (a longo prazo) ele míope.

Uma única mídia de inicialização (cartão SD, por exemplo) pode conter versões de 64 e 32 bits do sistema operacional, e o software de inicialização secundária (inicialização por u, inicialização por arm e outros) pode determinar qual carregar. A parte mais difícil é a terra do usuário - o sistema de arquivos teria que ser multi-arch, mesmo em sistemas de 32 bits onde o material de 64 bits será inútil. Eu abordaria isso com um script ou utilitário que poderia ser executado após a inicialização inicial para remover as bibliotecas e programas executáveis ​​desnecessários em sistemas apenas de 32 bits.

Daniel Glasser
fonte
Talvez precisemos de um ABI x32 para ARM. Então podemos ter pequenos ponteiros e todos os registros.
rsaxvc
2

As respostas existentes cobrem muito bem os problemas de um arco de 64 bits, mas não estou vendo muitas vantagens declaradas da atualização. Então, aqui estão duas que eu descobri recentemente:

  • Quando o PHP lida com registros de data e hora do Unix, o tamanho inteiro em um arco de 32 bits define um limite superior nas datas, de forma que eles não possam ir além de um dia específico em 2038 . Espero que esse seja um problema para todos os idiomas que lidam com carimbos de data e hora. (Felizmente, a maioria dos subsistemas de manipulação de data que não usam carimbos de data / hora Unix, como o DateTime do PHP, foram projetados especificamente para não serem limitados por esse problema, mesmo em CPUs mais antigas).
  • O Mongo está limitado a bancos de dados com tamanho 2G neste arco, e as compilações de 32 bits serão preteridas em breve. Do manual :

    A partir do MongoDB 3.2, os binários de 32 bits foram descontinuados e ficarão indisponíveis em versões futuras.

    Embora as compilações de 32 bits existam para Linux e Windows, elas não são adequadas para implantações de produção. Compilações de 32 bits também não suportam o mecanismo de armazenamento WiredTiger.

halter
fonte
Estranhamente, isso depende da sua plataforma. Geralmente não é o tamanho inteiro, mas o tamanho de time_t na biblioteca 'C'. Mesmo em plataformas de 32 bits, é possível usar um time_t de 64 bits com algum tempo de sobrecarga da CPU, mas muitas plataformas de 32 bits ainda não o fazem, pois há um problema de compatibilidade binária ao fazê-lo.
rsaxvc
@rsaxvc, interessante, obrigado. Então, eu poderia obter manipulação de tempo de 64 bits recompilando o PHP ou também exigiria modificação das bibliotecas C subjacentes? O primeiro estaria dentro da minha capacidade, mas não tenho certeza sobre o último - eu estava pensando em recompilar todo o Ras também, mas não parece haver nenhuma instrução simples para fazê-lo (ainda assim, de qualquer maneira).
Halfer
para Linux, você precisará corrigir o kernel, libc e seu aplicativo. Provavelmente não vale a pena. Após algumas leituras, o OpenBSD (no RPi) time_t é de 64 bits desde o 5.5. No Windows de 32 bits, usando o Visual Studio 2005 ou mais recente, time_t é de 64 bits.
rsaxvc
@rsaxvc: tudo bem, obrigado. Eu me pergunto se faz sentido para mim que esperar para um SO de 64 bits está disponível - soou iminente em alguns artigos de notícias de alguns meses atrás ....:-)
halfer
-4

Penso sobre isso: Embora eu não saiba exatamente como um processador ARM endereça a memória, posso dizer isso a partir de várias arquiteturas de CPU anteriores em que programei (SPARC / Alpha / i386 / AMD64 / X86_64): ao usar memória e endereçamento compartilhados pelo seu ponteiro de endereço virtual "real", a mudança para 64 bits não é trivial. Embora o memcpy faça o que deve ser feito, é necessário levar em consideração que em 64 bits os dados são armazenados assim (um pouco para trás):

HGFEDCBA
HGFEDCBA
HGFEDCBA

no entanto, em 32 bits, fica assim:

ABCD
ABCD
ABCD

Portanto, em 32 bits quando você armazena um jpeg na RAM, você pode ler os bytes do cabeçalho ou fazer a detecção de bordas, sem nenhum problema de maneira linear * digamos, avançando byte a byte. Mas em uma arquitetura de 64 bits, isso muda:

32bit:

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

64 bits:

for (i=-; i< img_length/8; i++) 
{ 
    address=shm_start+i; 
    for (c=7; c>=0; c--) 
    { 
        byte=((*address >> c) & 15) 
    } 
}
bobx
fonte
5
Endianness não tem nada a ver com o tamanho da palavra. Heck, muitas arquiteturas permitem que o programador selecione o endianness, incluindo ARM! Além disso, "64 bits" pode ter consequências totalmente diferentes, dependendo da arquitetura em questão, e é difícil comparar entre arquiteturas ou tentar estabelecer semelhanças entre elas.
31416 Bob
11
Eu não acho que eu = - é válido.
rsaxvc