Publicidade

O que é a Lei de Amdahl?

Por| Editado por Jones Oliveira | 26 de Maio de 2024 às 15h30

Link copiado!

Reprodução/rioryan, Unsplash
Reprodução/rioryan, Unsplash

Postulada pelo arquiteto computacional Gene Amdahl em 1967, a Lei de Amdahl é uma análise matemática que descreve como o aumento no número de processadores afeta a velocidade de execução de códigos em um PC. Mais que isso, a Lei ajuda a determinar o limite teórico de ganho de desempenho conforme o tipo de código executado por aqueles chips.

A Lei de Amdahl é crucial tanto para a programação quanto para o design de novos processadores por permitir dimensionar até que ponto adicionar mais núcleos ou threads irá impactar o desempenho de acordo com a aplicação.

Isso porque, na computação moderna, um dos principais pontos de ganho de performance está no processamento paralelo dos códigos, similar ao pipelining da arquitetura RISC

Continua após a publicidade

Descrição matemática da Lei de Amdahl

De maneira bastante simplificada, a fórmula da Lei de Amdahl estabelece a relação entre o “speedup”, ou ganho de velocidade, em relação ao aumento no número de processadores, de forma que o ganho é limitado pela fração de tempo que os novos processadores são, de fato, utilizados.

  • Onde:
    • S é o ganho de desempenho (speedup)
    • B é a proporção estritamente sequencial do código
    • n é o número de threads de processamento
O Canaltech está no WhatsApp!Entre no canal e acompanhe notícias e dicas de tecnologia

Incremento limitado por potencial de paralelismo

Todo código de computador tem, até certo ponto, instruções que exigem processamento sequencial, ou seja, que não podem ser quebradas para processamento em threads diferentes. Quanto maior o percentual de paralelismo do código (P), maior o ganho de desempenho (S) com o aumento no número de processadores.

Em um exemplo teórico, mesmo um programa com apenas 10% (0,1) de seu código estritamente sequencial, o ganho de desempenho com infinitos processadores seria de no máximo 10 vezes, dado que:

Continua após a publicidade
  • S=1/[0,1+(1-0,1)/∞] → S=1/[0,1+(0,9)/∞]

Como qualquer número dividido por ∞ tende a ZERO, então temos que:

  • S=1/(0,1+0)  → S=1/0,1→ S=10

Resumidamente, isso sígnica que mesmo em um programa altamente paralelizável, como o do exemplo acima, é inútil acrescentar muitas threads, pois o ganho de desempenho é limitado.

Continua após a publicidade

Aplicações da Lei de Amdahl em projetos

Naturalmente, nem todos os programas trazem um índice de paralelismo tão elevado, o que significa que, para algumas tarefas específicas, sequer compensa investir muito em multi-thread. Inclusive, é baseado na Lei de Amdahl que as fabricantes se pautam para definir a proporção de núcleos E (sem hyper thread) e núcleos P nos chips Intel Alder Lake em diante, por exemplo

Entre as principais aplicações práticas da Lei de Amdahl, temos: 

  • Avaliação de Desempenho: A Lei de Amdahl pode ser usada para avaliar o desempenho de um sistema. Tendo em vista o tempo que um programa leva para ser executado, e seu grau de paralelismo, a Lei de Amdahl permite calcular o speedup máximo.
  • Decisões de Design: Ao projetar novos sistemas, a Lei de Amdahl ajuda a tomar decisões esclarecidas sobre onde investir recursos. Se apenas uma pequena parte do código que será executado pode ser paralelizada, pode valer mais a pena investir em sistemas com frequências mais altas, do que em soluções com alta contagem núcleos.
  • Planejamento de Capacidade: Em um ambiente de computação em nuvem, a Lei de Amdahl ajuda no planejamento de capacidade. Ao dimensionar um rack em um Data Center, é possível determinar o número ideal de instâncias necessárias um serviço dependendo da aplicação específica.
  • Otimização (Paralelização) de Código: No desenvolvimento de software, a Lei de Amdahl ajuda a identificar partes do código que seriam mais benéficas para otimizar. Se uma parte do código que consome muito tempo de execução não pode ser quebrada em instruções paralelizáveis, pode ser mais benéfico focar em otimizar outras partes, aproveitando melhor os recursos da plataforma que irá rodar esse código.
Continua após a publicidade

Desafios de paralelizar um código

Considerando que a maioria dos processadores modernos já traz múltiplos núcleos físicos, alguns deles com suporte a multi-thread, a otimização dos códigos é essencial para maximizar o desempenho. Contudo, essa otimização depende de alguns fatores que podem representar desafios no processo.

  • Identificação de Paralelismo: Como já mencionado, todo código, fatalmente, terá parcelas que exigem execução sequencial. Identificar qual a fração desse código pode ser paralelizada é o primeiro passo para definir até que ponto aquela aplicação ainda é viável em sistemas modernos, bem como quão escalável ela pode ser mesmo após a otimização.
  • Sincronização: Mesmo em partes de um programa que pode ser executadas em paralelo, em alguns casos elas podem atuar em uma ou mais variáveis comuns. Sendo assim, é preciso sincronizar os tempos de retorno das partes interdependentes, garantindo que essas operações sejam realizadas sem inconsistências.
  • Comunicação entre Processos: Pela mesma razão, diferentes partes do programa podem precisar se comunicar entre si, seja por estarem atuando nas mesmas variáveis, seja por serem processos interdependentes. Estabelecer a comunicação entre os processos também pode interferir no desempenho final, principalmente em sistemas distribuídos, como em clusters de um servidor em nuvem, nos quais a comunicação entre os núcleos em unidades diferentes é mais lenta e varia conforme o interconector.
  • Balanceamento de Carga: Em um ambiente de computação paralela, o desempenho final, fatalmente, será prejudicado se um núcleo estiver sobrecarregado enquanto outros estão ociosos. Dessa forma, otimizar o pipelining do código para balancear a carga de trabalho de cada núcleo/thread é importantíssimo para garantir um desempenho ótimo.
Continua após a publicidade

Independentemente dos desafios do processo de paralelização, a otimização de códigos é essencial para o avanço da computação moderna por viabilizar saltos de desempenho consideráveis.

Dessa forma, a Lei de Amdahl, ao longo de quase 60 anos, é um fator que, somado a outros elementos-chave, vem proporcionando os avanços nas arquiteturas de hardware e software, uma vez que ela não apenas dimensiona, como avalia o potencial de ganhos em sistemas futuros e já instalados.