Se il secondo core virtuale è autorizzato a contribuire quando il primo sarebbe bloccato, è meglio che no , quindi si ottiene (almeno) un po 'di lavoro extra.
La domanda diventa: quando avere due thread diversi fa peggiorare uno? La previsione del ramo e le dipendenze tra le istruzioni non cambieranno. In attesa dell'accesso alla memoria ora ... i due thread competono sull'accesso alla memoria, sia nell'utilizzo della cache che nella larghezza di banda.
Se hai alcune CPU in esecuzione con HT e altre no, significa anche che assegnerai thread specifici a un tipo o all'altro? Non credo: i tuoi programmi eseguiranno i loro thread su core virtuali casuali. In che modo la suddivisione della configurazione aiuta? Poiché ogni CPU ha la propria cache, l'unico effetto è dovuto alla larghezza di banda della memoria e all'onere della coerenza della cache.
In generale, si raggiunge un punto in cui avere qualcosa in più che si potrebbe fare è più costoso che lasciare inattive alcune unità di esecuzione della CPU. Ciò non dipende direttamente dal numero di thread, ma da cosa stanno facendo i thread e dall'architettura di memoria dettagliata e dalle sfumature delle prestazioni dei vari componenti.
Non esiste una risposta semplice. Anche con un programma specifico in mente, la macchina può differire da quella delle persone che raccontano le proprie esperienze.
Devi provarlo tu stesso e misurare ciò che è più veloce, con quel lavoro specifico su quella macchina esatta. E anche allora, potrebbe cambiare con gli aggiornamenti del software e spostando l'utilizzo nel tempo.
Dai un'occhiata al volume 3 dell'opus magnum di Anger . Se si osserva attentamente un processore specifico, è possibile trovare risorse limitanti nella pipeline profonda di molti passaggi necessari per eseguire il codice. È necessario trovare un caso in cui l'eccessivo impegno lo induca a eseguire più lentamente, invece di non impegnarsi di più. In generale ciò significherebbe una sorta di memorizzazione nella cache; e dove la risorsa è condivisa tra i thread.
Cosa significa il misuratore della CPU: segnala tutto il tempo che non viene impiegato per eseguire il thread inattivo. Entrambi i thread logici assegnati a un core non saranno inattivi anche se il lavoro effettivo svolto su uno di essi potrebbe essere piccolo. Il tempo trascorso con la pipeline bloccata per alcuni cicli fino a quando i risultati non sono pronti, la memoria viene recuperata, le operazioni atomiche vengono recintate, ecc. Allo stesso modo non fare in modo che il thread venga archiviato come "non pronto", quindi non sarà inattivo, e il tempo è ancora in uso. L'attesa su RAM non verrà visualizzata come inattiva. Solo qualcosa come l'I / O bloccherà il thread e interromperà il tempo di ricarica. Un mutex del sistema operativo in generale lo farà, ma con l'ascesa di sistemi multicore non è più una cosa certa, poiché uno "spinlock" non farà tornare il thread sullo scaffale.
Quindi, un misuratore di CPU del 100% non significa che tutto vada liscio, se la CPU è spesso bloccata in attesa di memoria. Un numero inferiore di core logici che mostrano il 90% potrebbe benissimo fare più lavoro, poiché termina il crunching del numero e ora è in attesa sul disco.
Quindi non preoccuparti del misuratore della CPU. Guardate i progressi reali compiuti, solo .