Mais núcleos não significa que o computador é mais poderoso

O fato de escolher um processador com mais núcleos muitas vezes não se traduz em um aumento de desempenho no mesmo grau ao usar determinados programas. Por que esse fenômeno ocorre e, portanto, quais são as causas dele? Nós te explicamos em detalhes.

Um dos motivos para usar versões mais recentes de programas ao longo do tempo é que eles são projetados para aproveitar melhor os processadores com maior número de núcleos. Não esqueçamos que com o passar do tempo o número deles nas CPUs vai aumentando. No entanto, por que o desempenho não aumenta em programas iguais?

Mais núcleos não significa que o computador é mais poderoso

Os programas nunca escalam com o número de núcleos

É importante levar em consideração que os programas que são executados não têm a capacidade de dividir seus processos ou tarefas ativos em um determinado momento, de acordo com o número de threads de execução que temos em nosso CPU. Mais do que tudo pelo fato dessa divisão estar explícita no código do programa, ou seja, é produto da habilidade do programador e do design do aplicativo.

Na verdade, o que é relevante na hora de codificar um programa não é otimizá-lo para usar o maior número de núcleos possível, mas sim para latência. Entendendo o último como o tempo que um processador leva para concluir uma tarefa medida em unidades de tempo. E é que o desempenho de uma CPU consiste em concluir o maior número de tarefas no menor tempo possível. O que vai depender primeiro da sua arquitetura e depois da velocidade do seu clock.

No entanto, o que nos interessa em relação à latência é saber quantas tarefas ela pode terminar em um determinado período, qual é a carga de trabalho e isso dependerá da situação e da maneira como os programas foram escritos. Em outras palavras, o desempenho depende não apenas do hardware, mas de quão bem ou mal o software foi escrito.

Futuro Processadores Render

Divisão do trabalho em vários núcleos

Agora, se aumentarmos o número de núcleos em um sistema, será possível dividir o trabalho em partes e concluí-lo com muito mais facilidade. É aqui que entra a fórmula T/N, onde T é o número de tarefas a serem executadas e N é o número de threads de execução que o sistema pode executar. Obviamente, poderíamos carregar o número máximo de tarefas em poucos núcleos e forçá-los a corrigi-los. O problema é que essa medida é contraproducente porque beneficia as CPUs mais modernas, que têm desempenho superior individualmente em cada núcleo.

Núcleos Multihilo

No entanto, dividir o trabalho entre diferentes núcleos é um trabalho adicional que geralmente é dado a um núcleo que atua como condutor e deve realizar as seguintes tarefas:

  • Você deve criar processos e listas de tarefas e ter um bom controle disso o tempo todo.
  • Eles devem saber prever em todos os momentos quando uma tarefa começa e termina, incluindo o tempo que leva para terminar uma e iniciar outra.
  • Os diferentes kernels devem ter a capacidade de enviar um sinal ao kernel principal para saber quando um processo começa e termina.

Esta solução foi adotada pela SONY, Toshiba e IBM no Cell Broadband Engine, o processador central do PS3 onde um master core se encarregava de dirigir o resto. Embora muito mais atrás, foi adotado pelo Atari Jaguar. Para PS4 a SONY não repetiu mais esse modelo e ninguém implementou no PC porque é um pesadelo, porém, é a forma mais eficiente de dividir o trabalho.

Nem tudo pode ser executado em vários núcleos

Se nos perguntarmos se podemos dividir qualquer tarefa em subtarefas para distribuir em um número maior de núcleos indefinidamente, a resposta é não. Especificamente, temos que classificar as tarefas em três tipos diferentes:

  • Aqueles que podem ser totalmente paralelizados e, portanto, divididos entre os diferentes núcleos que o processador central possui.
  • Tarefas que podem ser executadas parcialmente em paralelo.
  • Partes do código que não podem ser executadas em paralelo.

No primeiro caso aplica-se T/N a 100%, no segundo caso já entramos na chamada Lei de Amdahl onde a aceleração devido ao aumento do número de núcleos é parcial e no terceiro caso simplesmente precisamos de todos os poder de um único núcleo para essa tarefa,

O que diferencia a CPU da GPU em multithreading

Aqui chegamos a um ponto diferencial, cada GPU ou chip gráfico possui uma unidade de controle que é responsável por ler as listas de comandos e distribuí-las entre os diferentes núcleos da GPU e até mesmo entre as diferentes unidades. Esta é uma implementação em nível de hardware do caso anterior e funciona perfeitamente em qualquer configuração em que você queira saturar, desde que haja trabalho e, portanto, mantenha o máximo de núcleos ocupados possível. No entanto, devemos entender que o conceito de thread de execução em uma GPU sempre corresponde a um dado correspondente e sua lista de instruções. Ou seja, um pixel, vértice ou qualquer dado.

CPUGPU

O que os torna fáceis de paralelizar. Ou seja, se quiséssemos fritar um ovo, o processo na CPU seria fritar o ovo, o que seria totalmente sequencial. Por outro lado, no chip gráfico, uma tarefa seria simplesmente aquecer o óleo ou adicionar um ovo à frigideira. Tudo isso não aceleraria a fritura de um ovo, mas de vários, por isso as GPUs são melhores para tarefas como calcular milhões de polígonos ou pixels ao mesmo tempo, mas não para tarefas sequenciais.