Se for permitido que o segundo núcleo virtual contribua quando o primeiro estiver preso, é melhor que não , para que você obtenha (pelo menos) um pouco mais de trabalho.
A questão é: quando dois tópicos diferentes fazem com que um seja pior? A predição da ramificação e as dependências entre as instruções não serão alteradas. Esperando o 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 rodando com HT e outras não, isso também significa que você irá designar threads específicas para um tipo ou outro? Acho que não: seus programas executarão seus threads em núcleos virtuais aleatórios. Então, como dividir a ajuda de configuração? Como cada CPU tem seu próprio cache, o único efeito é devido à largura de banda da memória e à carga da coerência do cache.
Em geral, você chega a um ponto em que ter algo mais que você poderia fazer é mais caro do que deixar algumas unidades de execução da CPU ficarem ociosas. Isso não depende do número de encadeamentos diretamente, mas de o que os encadeamentos estão fazendo e da arquitetura detalhada da memória e das nuances de desempenho dos vários componentes.
Não há uma resposta simples. Mesmo com um programa específico em mente, a máquina pode diferir daquelas de pessoas que relatam suas próprias experiências.
Você tem que experimentar você mesmo e medir o que é mais rápido, com esse trabalho específico nessa máquina exata. E mesmo assim, isso pode mudar com atualizações de software e mudança de uso ao longo do tempo.
Dê uma olhada no volume 3 do magnum opus de Anger. Se você examinar cuidadosamente algum processador específico, poderá encontrar recursos de limitação entre o pipeline profundo de muitas etapas necessárias para executar o código. Você precisa encontrar um caso em que o excesso de cometer faz com que seja executado mais lentamente, em vez de não levar mais trabalho. Em geral, isso significaria algum tipo de armazenamento em cache; e onde o recurso é compartilhado entre threads.
O que significa o medidor da CPU: ele informa todo o tempo que não é gasto na execução do thread inativo. Os dois segmentos lógicos atribuídos a um núcleo não ficarão inativos, embora o trabalho real feito em um deles possa ser pequeno. Tempo gasto com o pipeline preso por alguns ciclos até que os resultados estejam prontos, a memória seja buscada, as operações atômicas sejam protegidas, etc. da mesma forma, não faça com que o fio seja arquivado como "não pronto" para que não fique ocioso, e o tempo ainda mostra como em uso. Esperando na RAM não mostrará como ocioso. Apenas algo como I / O fará com que o segmento bloqueie e pare de carregar o tempo em direção a ele. Um mutex do sistema operacional em geral o fará, mas com o surgimento de sistemas multicore que não é mais uma certeza, já que um "spinlock" não fará o thread ir de volta na prateleira.
Portanto, um medidor de 100% da CPU não significa que tudo está funcionando bem, se a CPU estiver freqüentemente esperando pela memória. Um número menor de núcleos lógicos mostrando 90% poderia muito bem estar fazendo mais trabalho, já que termina o processamento de números e agora está aguardando no disco.
Portanto, não se preocupe com o medidor da CPU. Veja o progresso real realizado, somente .