Domanda

Ho un programma multithreading in esecuzione su un quad-core Intel i7.Quando eseguo Runtime.getRuntime.availableProcessors(), ottengo 8, e so che Hyperthreading è disponibile su questa CPU.

Tuttavia, quando creo i thread, i miei livelli della CPU sono al 100% (cioè non-zero) per 4 discussioni, il che significa che 4 fili non sono utilizzati.C'è un modo per abilitare iperthreading in Java?

È stato utile?

Soluzione

Iperthreading è abilitato dal fatto che tutti i moderni JVM utilizzano i thread nativi, quindi questa è un'impostazione di configurazione OS / CPU.

Tuttavia Hyperthreading non ti dà dei core extra, consente una multiproprietà a grana fine delle quattro CPU che hai. Cioè, mentre un filo è bloccato, dire in attesa che una pagina di memoria sia volata nella cache, un altro filo può ruotare e fare uso di parti della CPU. Aggiunge circa il 10% di più alla dimensione di un nucleo della CPU a causa di requisiti di pianificazione più complessi e non avvantaggiano tutte le applicazioni.

Se si è assicurati le quattro cpus con quattro fili, allora è possibile con iperthreading attivato o disattivato. Significa solo che quei thread stanno funzionando a caldo, senza bloccare molto.

Il motivo per cui Java riporta una CPU di 8 core, anziché 4 è perché il sistema operativo dice a Java che la CPU ha 8 core. Il sistema operativo ritiene che, poiché il sistema operativo è stato detto di programmare le discussioni come se fosse una CPU di 8 core, questo ha fatto aggiungere il supporto di Hyperthreading per osse molto più semplice. Il sistema operativo svolge la gestione dei thread come prima, ignaro di gran parte dei lavori interni di hyperthreading e consente alla CPU gestire la pianificazione del livello basso del gruppo AS e quando le parti della CPU sono disponibili.

Una discussione più dettagliata, con benchmarks può essere lettura qui < / P >.

Altri suggerimenti

Utilizzare il seguente comando

$ lscpu
.

L'uscita può essere utilizzata per determinare il numero effettivo di nuclei e se si dispone di hyperthreading abilitato o meno.

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
.

Il parallelismo effettivo che può essere raggiunto sarà (numero di prese) x (core per presa) X (fili per core).Per determinare se il processore è iperthreaded o non è possibile utilizzare i thread per parametro core.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top