IMHO, the point here is this:
Claiming an application is "hyper-threaded" is wrong. An application is
not hyper-threaded: the underlying hardware and OS support may be HTed.
We, as programmers, can take advantage of such a technology, but all we
are enabled to do is develop a "multi-threaded" application, maybe
executing IO intensive code in a secondary thread to keep the UI thread
responsive, etc.
We do not write code such as
#ifdef MULTIPROCESSOR
// MP, or HT, stuff here
#else
// SP stuff here.
#endif
We can (most often we should) create and use threads no matter of the
number of processors our software will run on (be them real processors,
as in MP machines, or "virtual" processors as in HT machines).
That's quite obvious: how can we know what kind of hardware our
application will be deployed to ?
The OS is a piece of software which is there just to hide the
underlying hw idiosyncrasies and provide a coherent programming model
to the software developers.
Parts of the OS ARE different when run on SP/MP machines, just because
the OS is responsible for thread scheduling and all other issues which
change according to the # of processors we have.
I am not meaning that the code we write will run without bugs no matter
of the # of CPUs.
A lot of issues arise on MP machines which will never happen on SP
machines, especially when we try to avoid locking as much as possible
(on MP machines that is really a good choice !): then we'll have to
face any sort of strange bugs, and we must be very careful therefore.
And this just considers the OS.
What about the VM we program against (be it the CLR or the JVM or any
other VM) ?
I mean, between a call to System.Threading.Thread.Start(...) and the
real work done by the CPU there are a lot of levels of virtualization !
When writing .NET code, IMHO, we should take the CLR as out target,
understand as much as possible all its multi-threading issues (no, it's
not enough to know what the Monitor.Enter method does :-( ) and let the
VM do its work under the hood.
This is because
a) we don't see the CPU, we see the VM
b) we cannot fully control the VM behaviour
c) the VM behaviour might change in future releases
Ok, I'm done with my long post

My basic opinion, just to summarize it: your code can leverage MP
thecnologies, but MP/HT are out of your code control !
Best Regards.
Claudio