Question

J'ai un programme multithread en cours d'exécution sur un processeur quad-core Intel core i7.Quand j'execute Runtime.getRuntime.availableProcessors(), J'obtiens 8, et je sais que l'hyperthreading est disponible sur ce CPU.

Cependant, lorsque je créer des threads, mon CPU est à 100% (c'est à direnon-zéro) pour 4 threads, ce qui signifie que 4 threads sont utilisés.Est-il possible d'activer l'hyperthreading en Java?

Était-ce utile?

La solution

L'Hyperthreading est activé par le fait que tous les Jvm utilisation de threads natifs, donc c'est un système d'exploitation et PROCESSEUR paramètre de configuration.

Cependant l'Hyperthreading ne pas vous donner plus de cœurs, il permet une granularité fine de la multipropriété des quatre cpu que vous avez.C'est que, si un thread est bloqué, dire en attente d'une page de mémoire pour être volé dans le cache, puis un autre thread peut contre-attaquer et de faire usage de certaines parties de la CPU.Il ajoute environ 10% supplémentaire de la taille d'un cœur de PROCESSEUR en raison aux plus complexes, les exigences de planification et ne profite pas à toutes les applications.

Si vous avez maximisé les quatre processeurs avec quatre fils, alors que c'est possible avec la technologie hyperthreading activé ou désactivé.Cela signifie simplement que les discussions sont en cours d'exécution à chaud, sans bloquer beaucoup.

La raison que des rapports de Java 8 core CPU, plutôt que 4 est parce que l'OS indique Java que le CPU a 8 coeurs.Le système d'exploitation croit que parce que l'OS a été dit à l'annexe fils comme si c'était un 8 core CPU, ce qui fait que l'ajout de support de l'hyperthreading aux Systèmes d'exploitation beaucoup plus simple.Le système d'exploitation porte sur la gestion des threads comme avant, sans se soucier beaucoup des rouages de l'hyperthreading et permet au PROCESSEUR de gérer le faible niveau de la planification de l'assemblée et lorsque des parties de la cpu sont disponibles.

Une discussion plus détaillée, avec des indicateurs peut être lu ici

Autres conseils

Utilisez la commande suivante

$ lscpu

La sortie peut être utilisée pour déterminer le nombre réel de cœurs et si vous avez l'hyperthreading activé ou non.

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

Le réel parallélisme qui peut être obtenu sera (Pas de.de Sockets) X (Cœurs par socket) X (Threads par cœur).Pour déterminer si votre processeur est hyperthread ou pas, vous pouvez utiliser les Threads par cœur paramètre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top