Quanta aceleração dá um hyper thread? (em teoria)

34

Eu estou querendo saber o que o speedup teórico é de CPUs hiper-threaded. Assumindo 100% de paralelização e 0 de comunicação - dois processadores dariam um aumento de velocidade de 2. E quanto ao CPU com hyper thread?

    
por Mikhail 05.05.2011 / 17:29

4 respostas

55

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

Para ilustrar isso, vamos analisar um benchmark real:

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

Isto mostra o aumento relativo 1 dos algoritmos de correspondência de strings (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 encadeamentos 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 todo o intervalo. Isto é, beneficia de hyperthreading.

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

O motivo? Nesse caso específico, é a 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 encadeamento de hardware está aguardando pela memória, o outro pode continuar a execução; um caso de uso principal para encadeamentos de hardware.

Os outros algoritmos exigem menos memória e não precisam esperar pelo ônibus. Eles são quase inteiramente computados e usam apenas aritmética inteira (operações de bits, na verdade). Portanto, não há potencial para execução paralela e nenhum benefício de pipelines de instruções paralelas.

1 ou seja Um fator de aceleração de 4 significa que o algoritmo é executado quatro vezes mais rápido do que se fosse executado com apenas um thread. Por definição, então, todo algoritmo executado em um thread tem um fator relativo de aceleração igual a 1.

    
por 05.05.2011 / 23:01
18

O problema é que depende da tarefa.

A noção por trás do hyperthreading é basicamente que todos os processadores modernos têm mais de um problema de execução. Geralmente mais perto de uma dúzia ou mais agora. Dividido entre Integer, ponto flutuante, SSE / MMX / Streaming (o que quer que seja chamado hoje).

Além disso, cada unidade tem velocidades diferentes. Ou seja Pode ser necessário um ciclo inteiro da unidade matemática 3 para processar algo, mas uma divisão de ponto flutuante de 64 bits pode levar 7 ciclos. (Estes são números míticos não baseados em nada).

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

No entanto, qualquer tarefa única 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 há uma segunda CPU, outra thread poderia rodar nela, usando as unidades de execução disponíveis que não estão em uso por dizer sua transcodificação de áudio, que é 98% SSE / MMX, e int e float as unidades estão totalmente ociosas, exceto por algumas coisas.

Para mim, isso faz mais sentido em um único mundo de CPU, onde falsificar uma segunda CPU permite que os threads cruzem mais facilmente esse limiar com pouca (ou nenhuma) codificação extra para lidar com essa segunda CPU falsa.

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

Então para realmente responder suas perguntas, isso dependeria das tarefas em seu processo, de quais unidades de execução ele está usando e em sua CPU, quais unidades de execução estão ociosas / subutilizadas e disponíveis para a segunda CPU falsa.

Algumas 'classes' de material computacional são beneficiadas (vagamente genericamente). Mas não existe uma regra rígida e rápida e, para algumas classes, diminui as coisas.

    
por 05.05.2011 / 17:53
5

Eu tenho algumas evidências para adicionar à resposta da geoffc em que eu realmente tenho uma CPU Core i7 (4-core) com hyperthreading e joguei um pouco com a transcodificação de vídeo, que é uma tarefa que requer uma quantidade de comunicação e sincronização, mas possui paralelismo suficiente para que você possa 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" hyperthreaded equivale a um equivalente de aproximadamente 1 CPU extra de poder de processamento. Os 4 núcleos extras "hyperthreaded" adicionaram aproximadamente a mesma quantidade de poder de processamento utilizável que os 3 a 4 núcleos "reais".

Dado que este não é um teste estritamente justo, todos os encadeamentos de codificação provavelmente competiriam pelos mesmos recursos nas CPUs, mas para mim ele mostrou pelo menos um pequeno aumento no poder de processamento geral.

A única forma real de mostrar se é ou não realmente útil executar alguns testes de tipo Integer / Floating Point / SSE diferentes ao mesmo tempo em um sistema com hyperthreading ativado e desativado e ver quanta capacidade de processamento está disponível em um ambiente controlado.

    
por 05.05.2011 / 18:35
3

Depende muito da CPU e da carga de trabalho, como outros disseram.

Intel diz :

Measured performance on the Intel® Xeon® processor MP with Hyper-Threading Technology shows performance gains of up to 30% on common server application benchmarks for this technology

(Isso parece um pouco conservador para mim.)

E há outro artigo mais longo (que eu ainda não li todos) com mais números aqui . Um interessante take-away desse papel é que hyperthreading pode fazer isso 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 multi-core abaixo do padrão dependendo de quão confiante você está do seu provável desempenho. Os números nessa peça sugerem um aumento de velocidade entre 0.5x e 1.5x.

Finalmente, o desempenho também depende do sistema operacional. O SO irá, esperançosamente, enviar processos para CPUs reais em preferência aos hyperthreads que estão meramente mascarados como CPUs. Caso contrário, em um sistema dual-core, você pode ter uma CPU ociosa e um núcleo muito ocupado com a remoção de dois threads. Eu pareço lembrar que isso aconteceu com o Windows 2000, embora, é claro, todos os sistemas operacionais modernos sejam adequadamente capazes.

    
por 06.05.2011 / 11:08