Número ideal de encadeamentos para tarefa de computação intensiva no servidor com Hyperthreading

2

Ao executar uma tarefa de computação intensiva em um servidor com um processador quad-core Intel i7 com Hyperthreading, é ideal executar oito threads (para os oito núcleos virtuais) ou apenas quatro (para os quatro núcleos físicos)? Cada thread consegue uma utilização consistente de 100% de um núcleo virtual.

    
por Will Johnson 08.02.2012 / 08:53

3 respostas

2

8 threads seriam ideais, assumindo que não há sobrecarga adicional significativa na combinação de resultados ou algo assim. Com apenas quatro threads, qualquer unidade de execução que não pudesse ser saturada pelo thread único por núcleo virtual seria desperdiçada. Com oito threads, eles podem ser usados.

Observe que isso se aplica apenas à suposição irreal de que cada thread pode saturar um núcleo. Além disso, pode não se aplicar se a divisão dos recursos do cache do processador impactar negativamente o desempenho. Algumas tarefas têm desempenho que "cai de um penhasco" em um determinado tamanho de cache. Se o seu desfiladeiro estiver entre o tamanho do cache completo do núcleo físico e metade desse tamanho de cache, então quatro encadeamentos poderão ser melhores.

    
por 08.02.2012 / 10:15
0

A doutrina que me ensinaram ao compilar foi 1.5x o número de núcleos. Isso é responsável por qualquer momento em que um thread / processo esteja esperando na E / S.

Se a sua tarefa não tiver chance de bloquear operações mais lentas, como E / S, talvez não seja necessário exceder o número de núcleos, mas, se puder, você precisará de mais processos do que os núcleos.

Veja desta forma: se você tiver quatro núcleos e três processos, nunca poderá atingir 100% da CPU. O mesmo vale para quatro processos quando um deles está bloqueando a E / S. Se você tem seis processos sem bloqueio, você pode ser um pouco menos eficiente, pois o kernel usa algum tempo de CPU trocando os processos dentro e fora dos quatro núcleos, mas nenhum núcleo jamais ficará inativo.

Infelizmente, não tenho ideia sobre o aspecto físico / virtual da sua pergunta.

    
por 08.02.2012 / 09:59
0

Meu palpite é que é ideal usar uma tarefa por núcleo e desabilitar o hyperthreading.

Se eu começar com muitos threads intensivos em cpu, já que tenho núcleos lógicos, terei opções de contexto rápidas para as tarefas intensivas de cpu, mas caras para as tarefas em segundo plano desde o hyperthreading totalmente consumido pelas tarefas intensivas de cpu. Por outro lado, se eu iniciar tantos threads com uso intensivo de CPU quanto eu tiver núcleos físicos, não terei opções de contexto para essas tarefas e opções de contexto rápidas para as tarefas em segundo plano. Parece bom, mas as tarefas em segundo plano encontrarão processadores lógicos livres e serão executados quase imediatamente. É como se eles fossem em tempo real (legal -20).

Eu não sei quão rápido é um switch de contexto entre duas tarefas no mesmo núcleo. Também tenho medo de que, ao compartilhar o cache entre dois threads no mesmo núcleo, a frequência de acertos do cache seja reduzida (a menos que estejam executando o mesmo programa menor que 1mb). Eu duvido que seja sem penalidades. Minha intuição é que uma tarefa complexa com CPU intensiva será executada mais rapidamente em uma tarefa por núcleo do que uma tarefa por processador virtual. Mas se você fizer isso, deixará dois processadores virtuais livres e as tarefas em segundo plano terão prioridade que não deveriam ter.

No primeiro cenário, o hyperthreading é uselles, as tarefas em segundo plano usarão switches de contexto caros porque eu maximizo o hyperthreading com o processamento normal. O segundo é inaceitável porque até 50% do meu poder de CPU é priorizado para as tarefas em segundo plano.

Normalmente, desabilito o hyperthreading em meus desktops e servidores intel. Eu mostro como no link .

Mas isso é baseado em suposições. Tenho a impressão de que é melhor, mas pode não ser.

    
por 06.09.2015 / 21:00