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.