Anúncio fechado

Mike Ash dedicado em seu blog as implicações práticas da mudança para a arquitetura de 64 bits no iPhone 5S. Este artigo baseia-se em suas descobertas.

A razão deste texto deve-se principalmente à grande quantidade de desinformação que se espalha sobre o que o novo iPhone 5s com processador ARM de 64 bits realmente significa para os usuários e para o mercado. Aqui tentaremos trazer informações objetivas sobre o desempenho, capacidades e implicações dessa transição para os desenvolvedores.

"64 bits"

Existem duas partes de um processador às quais o rótulo "X-bit" pode se referir - a largura dos registradores inteiros e a largura dos ponteiros. Felizmente, na maioria dos processadores modernos essas larguras são iguais, então no caso do A7 isso significa registros inteiros de 64 bits e ponteiros de 64 bits.

No entanto, é igualmente importante salientar o que “64 bits” NÃO significa: Tamanho do endereço físico da RAM. O número de bits para comunicação com a RAM (portanto, a quantidade de RAM que um dispositivo pode suportar) não está relacionado ao número de bits da CPU. Os processadores ARM têm endereços entre 26 e 40 bits e podem ser alterados independentemente do resto do sistema.

  • Tamanho do barramento de dados. A quantidade de dados recebidos da RAM ou memória buffer é igualmente independente deste fator. Instruções individuais do processador podem solicitar diferentes quantidades de dados, mas são enviadas em pedaços ou recebidas da memória mais do que o necessário. Depende do tamanho do quantum de dados. O iPhone 5 já recebe dados da memória em quanta de 64 bits (e tem processador de 32 bits), e podemos encontrar tamanhos de até 192 bits.
  • Qualquer coisa relacionada ao ponto flutuante. O tamanho desses registros (FPU) é novamente independente do funcionamento interno do processador. O ARM usa FPU de 64 bits desde antes do ARM64 (processador ARM de 64 bits).

Vantagens e desvantagens gerais

Se compararmos arquiteturas idênticas de 32 e 64 bits, elas geralmente não são tão diferentes. Esta é uma das razões para a confusão geral do público que procura uma razão pela qual a Apple também está migrando para 64 bits em dispositivos móveis. Porém, tudo vem dos parâmetros específicos do processador A7 (ARM64) e de como a Apple o utiliza, não apenas do fato do processador ter uma arquitetura de 64 bits.

Porém, se ainda olharmos para as diferenças entre essas duas arquiteturas, encontraremos diversas diferenças. O óbvio é que os registradores inteiros de 64 bits podem lidar com números inteiros de 64 bits com mais eficiência. Mesmo antes, era possível trabalhar com eles em processadores de 32 bits, mas isso geralmente significava dividi-los em pedaços longos de 32 bits, o que causava cálculos mais lentos. Portanto, um processador de 64 bits geralmente pode computar com tipos de 64 bits tão rápido quanto com tipos de 32 bits. Isso significa que os aplicativos que geralmente usam tipos de 64 bits podem ser executados muito mais rapidamente em um processador de 64 bits.

Embora 64 bits não afete a quantidade total de RAM que o processador pode usar, pode facilitar o trabalho com grandes porções de RAM em um programa. Qualquer programa executado em um processador de 32 bits possui apenas cerca de 4 GB de espaço de endereço. Levando em consideração que o sistema operacional e as bibliotecas padrão ocupam alguma coisa, isso deixa o programa com algo entre 1-3 GB para uso do aplicativo. No entanto, se um sistema de 32 bits tiver mais de 4 GB de RAM, usar essa memória será um pouco mais complicado. Temos que recorrer a forçar o sistema operacional a mapear esses pedaços maiores de memória para o nosso programa (virtualização de memória), ou podemos dividir o programa em vários processos (onde cada processo novamente teoricamente tem 4 GB de memória disponível para endereçamento direto).

No entanto, esses “hacks” são tão difíceis e lentos que poucos aplicativos os utilizam. Na prática, em um processador de 32 bits, cada programa usará apenas 1-3 GB de memória, e mais RAM disponível pode ser usada para executar vários programas ao mesmo tempo ou usar essa memória como buffer (cache). Esses usos são práticos, mas gostaríamos que qualquer programa pudesse usar facilmente pedaços de memória maiores que 4 GB.

Agora chegamos à afirmação frequente (na verdade incorreta) de que sem mais de 4 GB de memória, uma arquitetura de 64 bits é inútil. Um espaço de endereço maior é útil mesmo em um sistema com menos memória. Arquivos mapeados na memória são uma ferramenta útil onde parte do conteúdo do arquivo está logicamente vinculado à memória do processo sem que o arquivo inteiro precise ser carregado na memória. O sistema pode, por exemplo, processar gradativamente arquivos grandes, muitas vezes maiores que a capacidade da RAM. Em um sistema de 32 bits, esses arquivos grandes não podem ser mapeados de forma confiável na memória, enquanto em um sistema de 64 bits isso é muito fácil, graças ao espaço de endereço muito maior.

Entretanto, o tamanho maior dos ponteiros também traz uma grande desvantagem: caso contrário, programas idênticos precisam de mais memória em um processador de 64 bits (esses ponteiros maiores precisam ser armazenados em algum lugar). Como os ponteiros são uma parte frequente dos programas, essa diferença pode sobrecarregar o cache, o que, por sua vez, faz com que todo o sistema fique mais lento. Então, em perspectiva, podemos ver que se apenas mudássemos a arquitetura do processador para 64 bits, isso tornaria todo o sistema mais lento. Então esse fator tem que ser equilibrado por mais otimizações em outros lugares.

ARM64

O A7, o processador de 64 bits que alimenta o novo iPhone 5s, não é apenas um processador ARM normal com registros mais amplos. ARM64 contém melhorias importantes em relação à versão mais antiga de 32 bits.

Processador Apple A7.

Lista de Presentes

O ARM64 contém o dobro de registros inteiros que o ARM de 32 bits (tenha cuidado para não confundir o número e a largura dos registros - falamos sobre largura na seção "64 bits". Portanto, o ARM64 possui registros duas vezes mais largos e o dobro mais registradores). O ARM de 32 bits possui 16 registros inteiros: um contador de programa (PC - contém o número da instrução atual), um ponteiro de pilha (um ponteiro para uma função em andamento), um registro de link (um ponteiro para o retorno após o final da função) e os 13 restantes são para uso do aplicativo. No entanto, o ARM64 possui 32 registros inteiros, incluindo um registro zero, um registro de link, um ponteiro de quadro (semelhante a um ponteiro de pilha) e um reservado para o futuro. Isso nos deixa com 28 registros para uso do aplicativo, mais que o dobro do ARM de 32 bits. Ao mesmo tempo, o ARM64 dobrou o número de registros de ponto flutuante (FPU) de 16 para 32 registros de 128 bits.

Mas por que o número de registros é tão importante? A memória geralmente é mais lenta que os cálculos da CPU e a leitura/escrita pode demorar muito. Isso faria com que o processador rápido ficasse esperando pela memória e atingiríamos o limite natural de velocidade do sistema. Os processadores tentam esconder essa desvantagem com camadas de buffers, mas mesmo o mais rápido (L1) ainda é mais lento que o cálculo do processador. Porém, os registradores são células de memória diretamente no processador e sua leitura/escrita é rápida o suficiente para não desacelerar o processador. O número de registros praticamente significa a quantidade de memória mais rápida para cálculos do processador, o que afeta muito a velocidade de todo o sistema.

Ao mesmo tempo, essa velocidade precisa de um bom suporte de otimização do compilador para que a linguagem possa usar esses registradores e não precise armazenar tudo na memória geral da aplicação (a lenta).

Conjunto de instruções

ARM64 também traz grandes mudanças no conjunto de instruções. Um conjunto de instruções é um conjunto de operações atômicas que um processador pode executar (por exemplo, 'ADD registrador1 registrador2' adiciona os números em dois registradores). As funções disponíveis para idiomas individuais são compostas por estas instruções. Funções mais complexas devem executar mais instruções, portanto podem ser mais lentas.

Novidades no ARM64 são instruções para criptografia AES, funções hash SHA-1 e SHA-256. Portanto, em vez de uma implementação complexa, apenas a linguagem chamará esta instrução - o que trará uma enorme aceleração ao cálculo de tais funções e, esperançosamente, adicionará segurança nas aplicações. Por exemplo. o novo Touch ID também usa essas instruções na criptografia, permitindo velocidade e segurança reais (em teoria, um invasor teria que modificar o próprio processador para acessar os dados – impraticável, para dizer o mínimo, dado seu tamanho diminuto).

Compatibilidade com 32 bits

É importante mencionar que o A7 pode rodar totalmente no modo 32 bits sem necessidade de emulação. Isso significa que o novo iPhone 5s pode executar aplicativos compilados em ARM de 32 bits sem qualquer lentidão. Porém, então ele não pode utilizar as novas funções do ARM64, então vale sempre a pena fazer uma build especial só para o A7, que deve rodar bem mais rápido.

Mudanças no tempo de execução

Runtime é o código que adiciona funções à linguagem de programação, que ela pode utilizar enquanto a aplicação está em execução, até após a tradução. Como a Apple não precisa manter a compatibilidade dos aplicativos (que um binário de 64 bits roda em 32 bits), eles poderiam fazer mais algumas melhorias na linguagem Objective-C.

Um deles é o chamado ponteiro marcado (ponteiro marcado). Normalmente, os objetos e ponteiros para esses objetos são armazenados em partes separadas da memória. Entretanto, novos tipos de ponteiro permitem que classes com poucos dados armazenem objetos diretamente no ponteiro. Esta etapa elimina a necessidade de alocar memória diretamente para o objeto, bastando criar um ponteiro e o objeto dentro dele. Ponteiros marcados são suportados apenas na arquitetura de 64 bits também devido ao fato de que não há mais espaço suficiente em um ponteiro de 32 bits para armazenar dados úteis suficientes. Portanto, o iOS, diferentemente do OS X, ainda não suportava esse recurso. No entanto, com a chegada do ARM64, isso está mudando, e o iOS também alcançou o OS X nesse aspecto.

Embora os ponteiros tenham 64 bits, no ARM64 apenas 33 bits são usados ​​para o endereço do próprio ponteiro. E se conseguirmos desmascarar de forma confiável o restante dos bits do ponteiro, podemos usar esse espaço para armazenar dados adicionais – como no caso dos ponteiros marcados mencionados. Conceitualmente, esta é uma das maiores mudanças na história do Objective-C, embora não seja um recurso comercializável – portanto, a maioria dos usuários não saberá como a Apple está avançando no Objective-C.

Quanto aos dados úteis que podem ser armazenados no espaço restante de tal ponteiro marcado, o Objective-C, por exemplo, agora os está usando para armazenar os chamados contagem de referência (número de referências). Anteriormente, a contagem de referências era armazenada em um local diferente da memória, em uma tabela hash preparada para isso, mas isso poderia tornar todo o sistema lento no caso de um grande número de chamadas de alocação/desalocação/retenção/liberação. A tabela teve que ser bloqueada devido à segurança do thread, de modo que a contagem de referência de dois objetos em dois threads não pudesse ser alterada ao mesmo tempo. No entanto, este valor é recentemente inserido no restante dos chamados isa indicadores. Esta é outra vantagem e aceleração discreta, mas enorme, no futuro. No entanto, isso nunca poderia ser alcançado em uma arquitetura de 32 bits.

Informações sobre objetos associados, se o objeto é fracamente referenciado, se é necessário gerar um destruidor para o objeto, etc., também são inseridas novamente no local restante dos ponteiros para os objetos. Graças a essas informações, o Objective-C o tempo de execução é capaz de acelerar fundamentalmente o tempo de execução, o que se reflete na velocidade de cada aplicação. Nos testes, isso significa uma aceleração de cerca de 40-50% de todas as chamadas de gerenciamento de memória. Apenas mudando para ponteiros de 64 bits e usando esse novo espaço.

Conclusão

Embora os concorrentes tentem espalhar a ideia de que mudar para uma arquitetura de 64 bits é desnecessário, você já sabe que esta é apenas uma opinião muito desinformada. É verdade que mudar para 64 bits sem adaptar seu idioma ou aplicativos não significa nada - até torna todo o sistema lento. Mas o novo A7 usa um ARM64 moderno com um novo conjunto de instruções, e a Apple se deu ao trabalho de modernizar toda a linguagem Objective-C e aproveitar as vantagens dos novos recursos – daí a aceleração prometida.

Mencionamos aqui um grande número de razões pelas quais uma arquitetura de 64 bits é o passo certo. É mais uma revolução “sob o capô”, graças à qual a Apple tentará se manter na vanguarda não só com design, interface de usuário e ecossistema rico, mas principalmente com as tecnologias mais modernas do mercado.

Zdroj: mikeash.com
.