Would that mean that unparallel process will run slower on the same clock cycle CPU with 4 core 8 thread CPU than on 4 core 4 threadCPU because it is using only half of the core?
Classificar, sim e não.
Se eu executo 8 programas independentes de treaded em um 8 core (8 tread) CPU, cada núcleo irá executar um passo e estes serão executados em velocidade máxima (por exemplo, atribuir o tempo todo, ignorando coisas como o sistema operacional que também quer um pouco de CPU tempo).
Se eu executo 8 programas independentes de banda larga em uma CPU de 4 núcleos (4 passos), então, em média, cada núcleo executará dois deles. O programa será executado com metade da velocidade.
Até agora não há surpresas.
Agora, com uma CPU de 4 núcleos (8 passos), o sistema operacional acha que há 8 núcleos. Ele os seguirá como o primeiro caso. No entanto, este não é realmente o caso; metade dos núcleos não são construídos como núcleos regulares. Normalmente, apenas parte da funcionalidade é duplicada e, se você tiver má sorte, um dos degraus será interrompido. Não será mais rápido que uma CPU 4c / 4t.
No entanto, se você tiver muita sorte (por exemplo, as ALUs são duplicadas e você está alternando entre as trata de buscar informações da memória e adicionar), ambas podem ser executadas a toda velocidade.
Em média , isso leva a um aumento de velocidade de 30%.
Para tornar isso ainda mais complexo: se os programas usarem grandes conjuntos de dados, a execução de mais de quatro deles poderá resultar em menos acessos ao cache. O último pode realmente atrasar as coisas.
Is there a programmatic way (say OS level) to set CPU to only 1 thread per core?
Sim, a vez de hiper pisar.
Você pode fazer isso no firmware (por exemplo, no BIOS ou no UEFI) ou no sistema operacional.
Por exemplo para um CPU 8t 4core com núcleos 0 1 2 3 sendo os primeiros núcleos e 4 5 6 7 sendo o conjunto de trilhos que você poderia usar:
echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online
IIRC O FreeBSD fez o mesmo com um syscontrol. Para o OSX ou Windows, você precisaria pesquisar no Google.