Multithreading (arquitectura de computadores)
Multithreading Interleaved/TemporalEdit
MultithreadingEdit
O tipo mais simples de multithreading ocorre quando um thread corre até ser bloqueado por um evento que normalmente criaria um stall de longa latência. Tal atraso pode ser uma falha de cache que tem que acessar a memória off-chip, que pode levar centenas de ciclos de CPU para que os dados retornem. Em vez de esperar que a barraca seja resolvida, um processador com threads mudaria a execução para outra thread que estivesse pronta para rodar. Somente quando os dados para a thread anterior tivessem chegado, a thread anterior seria colocada de volta na lista de threads prontas para execução.
Por exemplo:
- Ciclo i: a instrução j da thread A é emitida.
- Ciclo i + 1: a instrução j + 1 da thread A é emitida.
- Ciclo i + 2: a instrução j + 2 da thread A é emitida, que é uma instrução de carga que falha em todos os caches.
- Cycle i + 3: o agendador de threads invocado, muda para thread B.
- Cycle i + 4: a instrução k da thread B é emitida.
- Cycle i + 5: a instrução k + 1 da thread B é emitida.
Conceptualmente, é similar ao multi-tarefa cooperativo utilizado em sistemas operacionais em tempo real, em que tarefas desistem voluntariamente do tempo de execução quando precisam esperar por algum tipo de evento. Este tipo de multithreading é conhecido como block, cooperativo ou multithreading de granulação grossa.
O objetivo do suporte a hardware multithreading é permitir a troca rápida entre um thread bloqueado e outro thread pronto para rodar. Para atingir este objetivo, o custo de hardware é replicar os registros visíveis do programa, assim como alguns registros de controle do processador (como o contador do programa). Mudando de uma thread para outra thread significa que o hardware muda de um conjunto de registros para outro; para mudar eficientemente entre threads ativas, cada thread ativa precisa ter seu próprio conjunto de registros. Por exemplo, para alternar rapidamente entre duas threads, o hardware do registro precisa ser instanciado duas vezes.
Suporte adicional de hardware para multithreading permite que a troca de thread seja feita em um ciclo da CPU, trazendo melhorias de desempenho. Além disso, hardware adicional permite que cada thread se comporte como se estivesse executando sozinha e não compartilhando nenhum recurso de hardware com outras threads, minimizando a quantidade de mudanças de software necessárias dentro da aplicação e do sistema operacional para suportar multithreading.
Muitas famílias de microcontroladores e processadores embarcados possuem múltiplos bancos de registros para permitir a troca rápida de contexto para interrupções. Tais esquemas podem ser considerados um tipo de multithreading de blocos entre o thread do programa do usuário e os threads de interrupção.
Interleaved multithreadingEdit
O objetivo do multithreading intercalado é remover todas as barracas de dependência de dados do pipeline de execução. Como uma thread é relativamente independente de outras threads, há menos chance de uma instrução em uma etapa do pipeline precisar de uma saída de uma instrução mais antiga no pipeline. Conceitualmente, é semelhante à multitarefa preemptiva usada em sistemas operacionais; uma analogia seria que a fatia de tempo dada a cada thread ativa é um ciclo de CPU.
Por exemplo:
- Ciclo i + 1: uma instrução da thread B é emitida.
- Ciclo i + 2: uma instrução da thread C é emitida.
Este tipo de multithreading foi primeiro chamado processamento de barril, no qual as pautas de um barril representam os estágios do pipeline e suas threads de execução. Multithreading intercalado, preemptivo, de grão fino ou temporizado são terminologias mais modernas.
Além dos custos de hardware discutidos no tipo de bloco de multithreading, o multithreading intercalado tem um custo adicional de cada estágio do pipeline rastreando o ID da rosca da instrução que está sendo processada. Além disso, como há mais threads sendo executadas simultaneamente no pipeline, recursos compartilhados como caches e TLBs precisam ser maiores para evitar thrashing entre as diferentes threads.
MultithreadingEdit simultâneo
O tipo mais avançado de multithreading aplica-se a processadores superscalares. Enquanto um processador superscalar normal emite múltiplas instruções de uma única thread a cada ciclo de CPU, em multithreading simultâneo (SMT) um processador superscalar pode emitir instruções de múltiplas threads a cada ciclo de CPU. Reconhecendo que qualquer thread única tem uma quantidade limitada de paralelismo em nível de instrução, este tipo de multithreading tenta explorar o paralelismo disponível em várias threads para diminuir o desperdício associado a slots de edição não utilizados.
Por exemplo:
- Ciclo i: as instruções j e j + 1 da thread A e a instrução k da thread B são emitidas simultaneamente.
- Ciclo i + 1: a instrução j + 2 da thread A, a instrução k + 1 da thread B e a instrução m da thread C são todas emitidas simultaneamente.
- Ciclo i + 2: instrução j + 3 da rosca A e instruções m + 1 e m + 2 da rosca C são todas emitidas simultaneamente.
Para distinguir os outros tipos de multithreading da SMT, o termo “multithreading temporal” é usado para denotar quando instruções de apenas uma rosca podem ser emitidas de cada vez.
Além dos custos de hardware discutidos para multithreading intercalado, SMT tem o custo adicional de cada etapa do pipeline rastreando o ID da thread de cada instrução sendo processada. Novamente, recursos compartilhados como caches e TLBs têm que ser dimensionados para o grande número de threads ativos sendo processados.
Aplicações incluem DEC (mais tarde Compaq) EV8 (não concluído), Tecnologia Hyper-Threading Intel, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT e AMD Bulldozer e microarquiteturas Zen.