Execução multithread na CPU: como funciona no desempenho

Quando falamos sobre processadores para PCs , é muito comum falar sobre o número de núcleos e os threads de processamento ou execução, que geralmente são o dobro do número de núcleos porque HyperThreading tecnologias no caso de Intel e SMT no caso of AMD o que eles fazem é que cada núcleo pode executar duas tarefas simultâneas. No entanto, essa é uma maneira um tanto simples de explicar como multithreading funciona em um processador, e neste artigo o que vamos fazer é explicá-lo com mais detalhes para que você possa entender todos os seus prós e contras.

Dito isso, todos sabemos que um processador que tem mais threads do que núcleos é capaz de executar mais tarefas simultaneamente e, de fato, o sistema operacional detecta o processador como se ele realmente tivesse tantos núcleos quanto threads. Por exemplo, um Intel Core i7-8700K tem 6 núcleos e 12 threads graças à tecnologia HyperThreading e Windows 10 o reconhece como um processador de 12 núcleos no estado em que se encontra (embora seja verdade que os chame de “processadores lógicos”) porque, para o sistema operacional, sua operação é completamente transparente.

Execução Multi-threaded na CPU

O que é processamento multithread?

Na arquitetura do computador, o processamento multi-thread é a capacidade da unidade central de processamento (CPU) para fornecer vários threads de execução ao mesmo tempo, com suporte do sistema operacional. Essa abordagem difere do multiprocessamento e não deve ser confundida; Em um aplicativo multithread, os threads compartilham os recursos de um ou mais núcleos do processador, incluindo unidades de computação, cache e o buffer de pesquisa de tradução (TLBL).

Multiprocesso vs multi hilo

Quando os sistemas de multiprocessamento incluem várias unidades de processamento completas em um ou mais núcleos, o multiprocessamento visa aumentar a utilização de um único núcleo usando paralelismo em nível de thread, bem como paralelismo em nível de instrução. Como as duas técnicas são complementares, elas são combinadas em quase todas as arquiteturas de sistema modernas com várias CPUs multi-threaded e com CPUs multi-core capazes de operar com várias threads.

O paradigma multithread se tornou mais popular à medida que os esforços para explorar o paralelismo no nível de instrução (ou seja, ser capaz de executar várias instruções em paralelo) pararam no final dos anos 1990. Isso permitiu que o conceito de computação de desempenho emergisse do campo mais especializado de processamento de transações.

Embora seja muito difícil acelerar ainda mais um único encadeamento ou programa, a maioria dos sistemas de computador realiza multitarefa entre vários encadeamentos ou programas e, portanto, as técnicas que melhoram o desempenho de todas as tarefas resultam em ganhos de desempenho. em geral. Em outras palavras, quanto mais instruções uma CPU puder processar ao mesmo tempo, melhor será o desempenho geral de todo o sistema.

Mesmo o processamento multi-thread tem desvantagens

Além dos ganhos de desempenho, um dos benefícios do processamento multi-threaded é que, se um thread tiver muitos erros de cache, os outros threads podem continuar a tirar proveito dos recursos da CPU não utilizados, o que pode levar a uma execução geral mais rápida. pois esses recursos estariam ociosos se apenas um único encadeamento estivesse em execução. Além disso, se um encadeamento não puder usar todos os recursos da CPU (por exemplo, porque as instruções dependem do resultado do anterior), a execução de outro encadeamento pode evitar que esses recursos fiquem ociosos.

Processador Reverso da CPU

Porém, tudo também tem seu lado negativo. Vários threads podem interferir uns nos outros compartilhando recursos de hardware, como cache ou buffers de pesquisa de tradução. Como resultado, os tempos de execução de thread único não são aprimorados e podem degradar, mesmo quando apenas um thread está em execução, devido a frequências mais baixas ou estágios de pipeline adicionais que são necessários para acomodar o hardware de comutação de processo.

A eficiência geral varia; A Intel diz que sua tecnologia HyperThreading o melhora em 30%, enquanto um programa sintético que executa apenas um ciclo de operações de ponto flutuante não otimizado e dependente recebe uma melhoria de 100% quando executado em paralelo. Por outro lado, programas em linguagem assembly ajustados manualmente que usam extensões MMX ou AltiVec e pré-pesquisa de dados (como um codificador de vídeo) não sofrem de vazamentos de cache ou recursos ociosos, portanto, não se beneficiam de uma execução . multi-threaded e pode realmente ter seu desempenho degradado devido à contenção de compartilhamento.

Do ponto de vista do software, o suporte a hardware multithread é totalmente visível, exigindo mais alterações nos programas de aplicativos e no próprio sistema operacional. As técnicas de hardware usadas para suportar processamento multithread são freqüentemente paralelas às técnicas de software usadas para multitarefa; Agendamento de threading também é um grande problema em multithreading.

Tipos de processamento multi-thread

Como dissemos no início, todos temos a concepção de que o processamento multi-threaded é simplesmente paralelização de processos (ou seja, executar várias tarefas ao mesmo tempo), mas na realidade as coisas são um pouco mais complicadas do que isso e existem diferentes tipos processamento multi-thread.

Múltiplos fios de "granulação grossa"

Melhores Processadores-CPUs-para-Streaming

O tipo mais simples de multithreading ocorre quando um thread é executado até ser bloqueado por um evento que normalmente criaria um bloqueio de longa latência. Esse travamento pode ser a falta de cache que precisa acessar a memória fora do chip, o que pode levar centenas de ciclos de CPU para que os dados voltem. Em vez de esperar que o travamento seja resolvido, o processador mudará a execução para outro encadeamento que já estava pronto para ser executado e, somente quando os dados do encadeamento anterior chegarem, ele será colocado de volta na lista de encadeamentos prontos para execução.

Conceitualmente, isso é semelhante à multitarefa cooperativa usada em sistemas operacionais de tempo real, em que as tarefas voluntariamente desistem do tempo de execução do processador quando precisam esperar que algum tipo de evento aconteça. Esse tipo de multithreading é conhecido como "bloco" ou "granulação grossa".

Multithread intercalado

O objetivo desse tipo de processamento multi-thread é remover todos os bloqueios de dependência de dados do pipeline de execução. Como um thread é relativamente independente dos outros, há menos chance de que uma instrução em um estágio de pipeline precise de uma saída de uma instrução anterior no mesmo canal; Conceitualmente, isso é semelhante à multitarefa preventiva usada no sistema operacional, e uma analogia seria que o intervalo de tempo dado a cada thread ativo é um ciclo da CPU.

Ejecução multi hilo

Obviamente, esse tipo de processamento multithread tem uma desvantagem principal: cada estágio do pipeline deve rastrear o ID do thread da instrução que está processando, o que diminui seu desempenho. Além disso, como há mais threads em execução ao mesmo tempo no pipeline, os compartilhamentos, como o cache, devem ser maiores para evitar erros.

Multithreading paralelo

O tipo mais avançado de multithreading se aplica a processadores conhecidos como superescalares. Enquanto uma CPU superescalar típica emite várias instruções de um único thread em cada ciclo da CPU, no processamento multithread simultâneo (SMT) um processador superescalar pode emitir instruções de vários threads em cada ciclo. Reconhecendo que qualquer thread tem uma quantidade limitada de paralelismo em nível de instrução, esses multithreading tentam explorar o paralelismo disponível em vários threads para reduzir o desperdício associado a espaços não utilizados.

Para distinguir os outros tipos de processamento multithread de SMT, o termo “multithreaded temporário” é freqüentemente usado para indicar quando instruções single-threaded podem ser emitidas ao mesmo tempo. Implementações desse tipo incluem DEC, EV8, Tecnologia HyperThreading da Intel, IBM Power5, Sun Mycrosystems UltraSPARC T2, Cray XMT e microarquiteturas Bulldozer e Zen da AMD.