Pergunta

Eu tenho um programa multithread em execução em um Intel i7 quad-core.Quando eu executo Runtime.getRuntime.availableProcessors(), recebo 8 e sei que o hyperthreading está disponível nesta CPU.

No entanto, quando crio threads, meus níveis de CPU estão em 100% (ou seja,diferente de zero) para 4 threads, o que significa que 4 threads não são utilizados.Existe alguma maneira de habilitar o hyperthreading em Java?

Foi útil?

Solução

O hyperthreading é habilitado pelo fato de que todas as JVMs modernas usam threads nativos, portanto, esta é uma configuração de sistema operacional/CPU.

No entanto, o Hyperthreading não oferece núcleos extras, ele permite o compartilhamento de tempo refinado dos quatro CPUs que você possui.Ou seja, enquanto um thread está paralisado, digamos, aguardando que uma página de memória seja transportada para o cache, outro thread pode entrar e fazer uso de partes da CPU.Ele adiciona cerca de 10% a mais ao tamanho de um núcleo de CPU devido a requisitos de agendamento mais complexos e não beneficia todos os aplicativos.

Se você atingiu o máximo de quatro CPUs com quatro threads, isso é possível com o hyperthreading ativado ou desativado.Significa apenas que esses threads estão funcionando bem, sem bloquear muito.

A razão pela qual Java relata uma CPU de 8 núcleos, em vez de 4, é porque o sistema operacional informa ao Java que a CPU possui 8 núcleos.O sistema operacional acredita que, como foi instruído a agendar threads como se fosse uma CPU de 8 núcleos, isso tornou a adição de suporte de hyperthreading aos sistemas operacionais muito mais simples.O sistema operacional continua gerenciando threads como antes, alheio a grande parte do funcionamento interno do hyperthreading e permite que a CPU gerencie o agendamento de baixo nível da montagem conforme e quando partes da CPU ficam disponíveis.

Uma discussão mais detalhada, com benchmarks, pode ser lida aqui

Outras dicas

Use o seguinte comando

$ lscpu

A saída pode ser usada para determinar o número real de núcleos e se o hyperthreading está habilitado ou não.

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                32
On-line CPU(s) list:   0-31
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 45
Stepping:              7
CPU MHz:               2399.995
BogoMIPS:              4799.35
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31

O paralelismo real que pode ser alcançado será (No.de soquetes) X (núcleos por soquete) X (threads por núcleo).Para determinar se o seu processador é hiperthread ou não, você pode usar o parâmetro Threads por núcleo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top