Hyper-threading exposes multiple logical cores for a single physical CPU core. In simple terms, hyper-threading makes context-switching more efficient for each CPU core.
Dual-core chips, on the other hand, actually have two physical CPU cores which can execute different processes simultaneously.
There are also other multi-core chips that have many more than two cores, and--as Svish mentioned--Intel's latest multi-core offerings also support Hyper-threading on all the cores.
You can use a CPU identification utility like CPU-Z to determine how many cores you have. As you can see near the bottom of the screenshot, the CPU in this case has 2 physical cores. If the number of threads is higher than the number of cores, Hyper-threading is enabled. To-date all consumer-oriented CPUs with Hyper-threading have 2 threads per core, so if HT is enabled, the number of threads will be 2x the number of cores.
If you have an Intel CPU, you can download Intel's CPU ID utility instead.
Why is there no option inthe BIOS?
I assume the reason why Dell and friends often do not add an option to disable this is because it rarely is a good idea. On average it will make your computer slower (or from a different point of view, it will make competitors computers relative faster).
Having said,that, lets look at some imaginary examples:
What does HT do?
1 core, no hyper-threading
- 1 CPU bound process is running, and can run and maximum speed. Lets call this speed 1, or 100%
- 2 CPU bound processes running. The CPU will have to switch between both. Effective speed on both processes is roughly halved. (The sum of both speeds is still equal to the first example.)
- 3 CPU bound processes running. The CPU will have to switch between all three. Effective speed on both processes is roughly a a third. (The sum of both speeds is still the same ( 3 x 0.33 = 1 ).
2 cores, no hyper-threading
- 1 CPU bound process *0 is running, and can run and maximum speed for that core. (speed 100%) (The other core is idle).
- 2 CPU bound processes running. Both can run at maximum speed for their core. (speed 200%)
- 3 CPU bound processes running. Usually you get 3 tasks running at about 2/3rd efficiency. (The sum of the speeds is still '2'. Roughly 2 because you loose a bit due to extra overhead and cache misses). (speed 200%, or maybe 190%)
Now cores with hyper-threading . These act as two cores, but not two complete cores. What Intel defines as hyper-threading has changed a bit over time, but usually it comes down to this. A CPU fetches data from memory and computes. If it does not need the memory bus then a second part of the CPU can do limited work. Since not all hardware is duplicated you do not get two full cores. However with limited extra hardware (10%?) you gain on average 30% speed. *1
1 core, with
- 1 CPU bound process is running, and can run and maximum speed. (100%)
- 2 CPU bound processes running. The CPU will have to switch between both. However it has some extra hardware. Net speed will be about 30% faster (say speed 133% for a single core)
Etc.
So much for the introduction to HT.
Are these fictional %'s real?
No. First of all you will loose efficiency due to overhead. (10 tasks on one CPU will not run slower than just one task with no context switches and all of the cache for its data).
Secondly I totally ignored turbo boost since that would complicate the explanation.
What did my friend possibly mean to say?
Lets look at your 4 core 8 treads CPU like this:
Core 1, CPU 1 (real)
Core 1, CPU 2 (with HT)
Core 2, CPU 3 (real)
Core 2, CPU 4 (with HT)
Core 3, CPU 5 (real)
Core 3, CPU 6 (with HT)
Core 4, CPU 7 (real)
Core 4, CPU 8 (with HT)
If I run two tasks I do not want both of them on CPU1 and CPU2 (since they share an actual core) and the nett result is near half of the possible speed. This might be what your friend meant.
While true I think that you do not need to worry. The windows scheduler is smart enough to allocate processes first to CPUs 1,3,5,7 and only then to 2,4,6,8.
*0 A CPU bound process is a process which is limited by the CPU. If a process is waiting for diskIO and the CPU is idle then you get totally different results.
*1 Please take those numbers with a grain of salt. They are not precise. They will vary per CPU generation and even per CPU model. They will vary per program. And what Intel calls hyper-threading has changed since early CPU generations. However they do give a rough idea.
Best Answer
The scheduling of processes is really up to the kernel. See a, b, c and d. Yes, there's sourcecode in some of those links. But it's not really avoidable when dealing with something this low-level.