A melhor escolha depende do sistema. Portanto, o que você deseja fazer é executar as duas versões em um sistema real e, em seguida, verificar como o sistema responde. Você ainda pode usar navegador, editor de texto, outras coisas no seu sistema? E o desempenho é melhor ao usar n threads e não n-1? O que acontece se você executar o aplicativo em conjunto com outro aplicativo que tente usar todas as CPUs?
E então você precisa considerar o hyperthreading. Com quatro núcleos mais hyperthreading, você pode usar 8 núcleos ou 7 núcleos. Mais uma vez, tente a capacidade de resposta do sistema e a hora de terminar.
E, finalmente, considere dividir seu trabalho em mais blocos do que threads. O motivo é que diferentes threads concluirão o trabalho em momentos diferentes e, então, você deseja que algum trabalho seja entregue aos threads mais rápidos. Caso contrário, você terá que esperar até que o último encadeamento seja concluído.
PS. "Hyperthreading não pode ajudar com código intensivo de FPU porque existe apenas um FPU". Absolutamente errado. É incrivelmente difícil, mesmo com código intensivo de FPU, fazer pleno uso da FPU devido a latências. O Hyperthreading ajuda porque há duas vezes mais operações independentes disponíveis para agendamento.