Se é permitido que o segundo núcleo virtual contribua quando o primeiro seria bloqueado, é melhor que não , então você realiza (pelo menos) um pouco de trabalho extra.
A questão é: quando ter dois threads diferentes faz com que um funcione pior? A previsão do ramo e as dependências entre as instruções não serão alteradas. Aguardando acesso à memória agora ... os dois threads competem pelo acesso à memória, tanto na utilização do cache quanto na largura de banda.
Se você tem algumas CPUs executando com HT e outras não, isso também significa que você atribuirá threads específicos a um tipo ou outro? Acho que não: seus programas executam seus threads em núcleos virtuais aleatórios. Então, como a divisão da configuração ajuda? Como cada CPU possui seu próprio cache, o único efeito é devido à largura de banda da memória e ao ônus da coerência do cache.
Em geral, você chega a um ponto em que ter algo mais a fazer pode ser mais caro do que deixar algumas unidades de execução da CPU ociosas. Isso não depende diretamente do número de threads, mas do que os threads estão fazendo e da arquitetura detalhada da memória e das nuances de desempenho dos vários componentes.
Não existe uma resposta simples. Mesmo com um programa específico em mente, a máquina pode ser diferente da das pessoas que relatam suas próprias experiências.
Você deve tentar e medir o que é mais rápido, com esse trabalho específico nessa máquina exata. E mesmo assim, isso pode mudar com as atualizações de software e a mudança de uso ao longo do tempo.
Dê uma olhada no volume 3 da magnum opus da Anger . Se você observar atentamente algum processador específico, poderá encontrar recursos limitantes no pipeline profundo de muitas etapas necessárias para executar o código. Você precisa encontrar um caso em que o comprometimento excessivo faça com que ele seja executado mais lentamente, em vez de não levar mais trabalho. Em geral, isso significaria algum tipo de cache; e onde o recurso é compartilhado entre threads.
O que significa o medidor de CPU: ele relata o tempo todo que não é gasto executando o encadeamento ocioso. Os dois encadeamentos lógicos atribuídos a um núcleo não ficarão ociosos, mesmo que o trabalho real realizado em um deles possa ser pequeno. O tempo gasto com o pipeline travou por alguns ciclos até que os resultados estejam prontos, a memória é buscada, as operações atômicas são protegidas etc. etc. também não fazem com que o encadeamento seja arquivado como "não pronto", para que não fique ocioso, e o tempo ainda aparece como em uso. Esperar na RAM não será exibido como ocioso. Somente algo como E / S fará com que o encadeamento bloqueie e pare o tempo de carregamento. Um mutex de sistema operacional em geral fará isso, mas com o surgimento de sistemas multicore, isso não é mais certo, pois um "spinlock" não fará com que o encadeamento volte à prateleira.
Portanto, um medidor de CPU de 100% não significa que tudo corre bem, se a CPU geralmente fica presa à espera de memória. Um número menor de núcleos lógicos mostrando 90% poderia muito bem estar realizando mais trabalho, pois termina o processamento de números e agora está aguardando no disco.
Portanto, não se preocupe com o medidor de CPU. Olhe para o progresso real feito, única .