Threads de execução na CPU e sua diferença com os processos de software

Os computadores não são mais como o início executando um processo e, obrigado, eles agora têm a capacidade de executar um grande número de programas em paralelo. Alguns deles nós vemos em nossos jogos, outros são invisíveis, mas lá estão eles, sendo executados pelo CPU. Existe uma relação entre os processos do software e threads de execução com os do hardware?

Frequentemente ouvimos ou lemos o conceito de thread de execução quando ouvimos sobre novas CPUs, mas também no mundo do software. É por isso que decidimos explicar as diferenças entre o que são os processos ou threads de execução no software e seus equivalentes significativos no hardware.

Processos no software

Threads de execução na CPU

Em sua definição mais simples, um programa nada mais é do que uma sucessão de instruções ordenadas sequencialmente na memória, que são processadas pela CPU, mas a realidade é mais complexa. Quem tem pouco conhecimento de programação saberá que esta definição corresponde aos diferentes processos que se executam num programa, onde cada processo se intercomunica com os outros e se encontra numa parte da memória.

Hoje temos um grande número de programas rodando em nosso computador e, portanto, um número muito maior de processos, que lutam para acessar os recursos da CPU para serem executados. Com tantos processos ao mesmo tempo, é necessário um condutor para se encarregar de gerenciá-los. Esse trabalho está nas mãos do sistema operacional, que, como se fosse um sistema de controle de tráfego de uma grande cidade, se encarrega de gerenciar e planejar os diferentes processos que vão ser executados.

No entanto, os processos de software são frequentemente referidos como threads de execução e não é uma definição ruim se levarmos em consideração sua natureza, mas a definição não coincide em ambos os mundos, então eles são frequentemente confundidos e isso leva a vários mal-entendidos sobre como funciona o hardware e software multithread. É por isso que neste artigo decidimos chamar os threads dos processos de software para diferenciá-los daqueles do hardware.

O conceito de bolha ou parada em uma CPU

Burbuja Procesos

Uma bolha ou parada na execução ocorre quando um processo que executa a CPU por algum motivo não pode continuar, mas também não foi encerrado no sistema operacional. Por esse motivo, os sistemas operacionais têm a capacidade de suspender um thread de execução quando a CPU não pode continuar e atribuir o trabalho a outro kernel que está disponível.

No mundo do hardware apareceu no início dos anos 2000 o que chamamos de multithreading com o Hyperthreading dos Pentium IVs. O truque era duplicar a unidade de controle da CPU que é responsável pela captura e decodificação. Com isso conseguiu-se que o sistema operacional acabasse vendo o processador como se fossem dois processadores diferentes e atribuísse a tarefa à segunda unidade de controle. Isso não dobra a potência, mas quando a própria CPU travava em um thread de execução, passava para o outro imediatamente para aproveitar o tempo de inatividade ocorrido e obter mais desempenho dos processadores.

O multithreading no nível do hardware, duplicando a unidade de controle, que é a parte mais complexa de uma CPU moderna, aumenta completamente o consumo de energia. Assim, as CPUs para smartphones e tablets não possuem multithreading de hardware em suas CPUs.

O desempenho depende do sistema operacional

Procesos Sistema Operativo

Embora as CPUs possam executar dois threads de execução por núcleo, é o sistema operacional que é responsável por gerenciar os diferentes processos. E hoje o número de processos em execução em um sistema operacional é maior do que o número de núcleos que uma CPU pode executar simultaneamente.

Portanto, uma vez que o sistema operacional se encarrega de administrar os diferentes processos, também é este o encarregado de atribuí-los. Esta é uma tarefa muito fácil se estamos falando de um sistema homogêneo em que cada núcleo tem o mesmo poder. Mas, em um sistema totalmente heterogêneo com núcleos de diferentes poderes, isso é uma complicação para o sistema operacional. A razão para isso é que ele precisa de uma forma de medir qual é o peso computacional de cada processo, e isso não é medido apenas pelo que ocupa na memória, mas pela complexidade das instruções e algoritmos.

O salto para núcleos híbridos já ocorreu no mundo da ARM processadores onde sistemas operacionais como iOS e Android tiveram que se adaptar ao uso de núcleos de diferentes desempenhos trabalhando simultaneamente. Ao mesmo tempo, a unidade de controle de projetos futuros teve que ser ainda mais complicada no x86. O objetivo? Que cada processo no software seja executado na thread apropriada do hardware e que a própria CPU tenha mais independência na execução dos processos.

Como é a execução de processos nas GPUs?

GPU TFLOPS Velocidad

As GPUs em suas unidades de sombreador também executam programas, mas seus programas não são sequenciais, em vez disso, cada thread de execução é composta por uma instrução e seus dados, que têm três condições diferentes:

  • Os dados são encontrados ao lado da instrução e podem ser executados diretamente.
  • A instrução encontra o endereço de memória dos dados e tem que esperar que os dados cheguem da memória aos registradores da unidade de sombreador.
  • Os dados dependem da execução de uma thread de execução anterior.

Mas um GPU não executa um sistema operacional que pode lidar com os diferentes threads. A solução? Todas as GPUs usam um algoritmo no escalonador de cada unidade de sombreador, o equivalente à unidade de controle. Este algoritmo é denominado Round-Robin e consiste em dar um tempo de execução em ciclos de clock para cada thread de execução / instrução. Se não for resolvido nesse tempo, vai para a fila e executa-se a próxima instrução da lista.

Os programas shader não são compilados no código, devido ao fato de que existem diferenças substanciais no ISA interno de cada GPU, o controlador é responsável por compilar e empacotar os diferentes threads de execução, mas o código do programa é responsável por gerenciar eles. . Portanto, é um paradigma diferente de como a CPU executa os diferentes processos.