Quanta aceleração um hiper thread fornece? (em teoria)

38

Eu estou querendo saber qual é a aceleração teórica de CPUs hiperencadeadas. Assumindo 100% de paralelização e 0 comunicação - duas CPUs dariam uma aceleração de 2. E a CPU hiperencadeada?

Mikhail
fonte

Respostas:

59

Como outros já disseram, isso depende inteiramente da tarefa.

Para ilustrar isso, vejamos uma referência real:

insira a descrição da imagem aqui

Isso foi retirado da minha tese de mestrado (atualmente não disponível online).

Isso mostra a aceleração relativa 1 dos algoritmos de correspondência de string (cada cor é um algoritmo diferente). Os algoritmos foram executados em dois processadores quad-core Intel Xeon X5550 com hyperthreading. Em outras palavras: havia um total de 8 núcleos, cada um dos quais pode executar dois threads de hardware (= "hyperthreads"). Portanto, o benchmark testa a aceleração com até 16 threads (que é o número máximo de threads simultâneos que essa configuração pode executar).

Dois dos quatro algoritmos (azul e cinza) escalam mais ou menos linearmente em toda a faixa. Ou seja, ele se beneficia do hyperthreading.

Dois outros algoritmos (em vermelho e verde; escolha infeliz para daltônicos) são dimensionados linearmente para até 8 threads. Depois disso, eles estagnam. Isso indica claramente que esses algoritmos não se beneficiam do hyperthreading.

O motivo? Nesse caso em particular, é carga de memória; os dois primeiros algoritmos precisam de mais memória para o cálculo e são limitados pelo desempenho do barramento de memória principal. Isso significa que enquanto um segmento de hardware está aguardando memória, o outro pode continuar a execução; um caso de uso principal para encadeamentos de hardware.

Os outros algoritmos requerem menos memória e não precisam esperar o barramento. Eles são quase inteiramente vinculados à computação e usam apenas aritmética inteira (operações de bit, de fato). Portanto, não há potencial para execução paralela nem benefícios de pipelines de instruções paralelas.


1 Ou seja, um fator-speed-se de 4 significa que o algoritmo é executado quatro vezes mais rápido como se fosse executado com apenas um thread. Por definição, então, todo algoritmo executado em um encadeamento possui um fator de aceleração relativo de 1.

Konrad Rudolph
fonte
Melhor resposta :-)
Sklivvz 5/05
11
Quais são as velocidades reais dos algoritmos, plotadas contra o número de núcleos? Ou seja, qual é o ganho de velocidade para o algoritmo mais rápido nesses testes? Apenas me perguntando :).
crazy2be
@ crazy2be Para a linha azul ( algoritmo de Horspool ), o tempo de execução passa de 4,16 segundos para 0,35 segundos com 16 threads. Portanto, a aceleração é 11,74. No entanto, isso é com hiperencadeamento. Quando plotado em relação ao número de núcleos, a aceleração desse algoritmo é de 7,17 em 8 núcleos.
Konrad Rudolph
5
o único problema com esta resposta é que eu só posso votar uma vez. É uma resposta incrivelmente objetiva para uma questão subjetiva;)
Journeyman Geek
20

O problema é que depende da tarefa.

A noção por trás do hyperthreading é basicamente que todas as CPUs modernas têm mais de um problema de execução. Geralmente mais perto de uma dúzia ou mais agora. Dividido entre Inteiro, ponto flutuante, SSE / MMX / Streaming (como é chamado hoje).

Além disso, cada unidade possui velocidades diferentes. Ou seja, pode levar uma unidade matemática inteira de 3 ciclos para processar alguma coisa, mas uma divisão de ponto flutuante de 64 bits pode levar 7 ciclos. (Estes são números míticos que não se baseiam em nada).

A execução fora de ordem ajuda muito a manter as várias unidades o mais cheias possível.

No entanto, uma única tarefa não utilizará todas as unidades de execução a cada momento. Nem mesmo a divisão de threads pode ajudar totalmente.

Assim, a teoria torna-se fingindo que existe uma segunda CPU, outro thread pode ser executado nela, usando as unidades de execução disponíveis que não são usadas, por exemplo, sua transcodificação de áudio, que é 98% SSE / MMX, e as unidades int e float são totalmente ocioso, exceto por algumas coisas.

Para mim, isso faz mais sentido em um único mundo de CPU; criar uma segunda CPU permite que os threads cruzem esse limite com mais facilidade com pouca (se houver) codificação extra para lidar com essa segunda CPU falsa.

No mundo principal de 3/4/6/8, com CPU de 6/8/12/16, isso ajuda? Não sei. Tanto quanto? Depende das tarefas em mãos.

Portanto, para responder às suas perguntas, isso dependeria das tarefas em seu processo, quais unidades de execução estão sendo usadas e, em sua CPU, quais unidades de execução estão ociosas / subutilizadas e disponíveis para a segunda CPU falsa.

Diz-se que algumas 'classes' de material computacional se beneficiam (vagamente genericamente). Mas não existe uma regra rígida e rápida e, para algumas classes, torna as coisas mais lentas.

geoffc
fonte
2
Embora eu estivesse procurando por algo como "1.7 time speedup", essa resposta é muito boa, pois não dá uma olhada em preto e branco nesse problema.
Mikhail
@ Mikhail: O ponto é que não há um fator simples - depende, como muitas vezes na vida :-).
Sleske 5/05
4
A essência está certa. Um problema: no entanto, não há uma razão a priori para que um único núcleo se beneficie mais do hyperthreading do que vários núcleos. Para a tarefa errada, nem lucro. Para a tarefa certa, ambos lucram pelo mesmo fator.
Konrad Rudolph
@ Konrad: Eu acho que o ponto em que eu estava chegando é a diferença entre um núcleo e dois núcleos pode ser mais valiosa do que a diferença entre 4 e 8 ou 2 e 4. Ou seja, ter um segundo núcleo, para um aplicativo mal segmentado, pode ajudar um pouco mais.
# Geoffc #
"Para um aplicativo mal segmentado" - essa é a parte importante. Mas, realisticamente, o suporte de threading da maioria dos aplicativos é ruim, portanto você tem razão.
Konrad Rudolph
5

Eu tenho algumas evidências anedóticas a serem adicionadas à resposta de geoffc, na verdade, eu tenho uma CPU Core i7 (4 núcleos) com hyperthreading e joguei um pouco com a transcodificação de vídeo, que é uma tarefa que requer muita comunicação e sincronização, mas tem bastante paralelismo em que você pode efetivamente carregar totalmente um sistema.

Minha experiência em jogar com quantas CPUs são atribuídas à tarefa geralmente usando os 4 núcleos "extras" hiperencadeados equivale a um equivalente a aproximadamente 1 CPU extra no valor de poder de processamento. Os 4 núcleos "hyperthread" extras adicionaram aproximadamente a mesma quantidade de poder de processamento utilizável da passagem de 3 para 4 núcleos "reais".

Concedido que este não é estritamente um teste justo, pois todos os threads de codificação provavelmente competirão pelos mesmos recursos nas CPUs, mas para mim isso mostrou pelo menos um pequeno aumento no poder geral de processamento.

A única maneira real de mostrar se realmente ajuda ou não seria executar alguns testes diferentes do tipo Número inteiro / Ponto flutuante / SSE ao mesmo tempo em um sistema com o hyperthreading ativado e desativado e ver quanto poder de processamento está disponível em um ambiente controlado. meio Ambiente.

Mokubai
fonte
11
Bem, um ponto claro - é dependente da aplicação. Tenho certeza de que a computação de alta comunicação poderia ser acelerada, já que o núcleo 0 e o núcleo 0-h se comunicariam pelo mesmo cache, sem usar RAM lenta.
Mikhail
11
@Mikhail, o problema é que, se os dois threads exigirem uma grande quantidade de poder de processamento, estarão competindo pelos mesmos recursos e seria muito melhor se comunicar através do cache L3 compartilhado da CPU (o i7 tem cache L1 e L2 por núcleo e um cache L3 compartilhado) ou mesmo memória do sistema e executando suas tarefas separadamente. É tudo um exercício maciço de balanços e rotatórias ...
Mokubai
3

Depende muito da CPU e da carga de trabalho, como já foi dito.

A Intel diz :

O desempenho medido no processador Intel® Xeon® MP com tecnologia Hyper-Threading mostra ganhos de desempenho de até 30% nos benchmarks de aplicativos de servidor comuns para esta tecnologia

(Isso me parece um pouco conservador.)

E há outro artigo mais longo (que ainda não li tudo) com mais números aqui . Uma conclusão interessante desse artigo é que o hyperthreading pode tornar o thras mais lento para algumas tarefas.

A arquitetura Bulldozer da AMD pode ser interessante . Eles descrevem cada núcleo como efetivamente 1,5 núcleos. É um tipo de hyperthreading extremo ou multinúcleo sub-padrão, dependendo da confiança que você tem em seu desempenho provável. Os números dessa peça sugerem uma aceleração de comentário entre 0,5x e 1,5x.

Finalmente, o desempenho também depende do sistema operacional. Esperamos que o sistema operacional envie processos para CPUs reais , de preferência para os hyperthreads que estão apenas disfarçados de CPUs. Caso contrário, em um sistema de núcleo duplo, você pode ter uma CPU ociosa e um núcleo muito ocupado com dois threads debitados. Eu me lembro que isso aconteceu com o Windows 2000, embora, é claro, todos os sistemas operacionais modernos sejam capazes.

Stephen Darlington
fonte
11
A OS tem que certificar-se de que os fios não relógio de bloquear o outro :)
Mikhail