How to define CPU sets for different hardware cores?
We're doing a small benchmarking research on parallel benefits of Niagaras, and as one part of
the research, we want to find out whether there are performance differences between hardware
CPU cores and strands within a core. From theory, only one strand of a core is executing at any
given moment, others are "parked" while waiting for IO, RAM, etc. So it may be possible to see
some difference between a program running with 4-processor "pset"s, i.e. 4 strands of one core
and 4 separate cores.
While I can use psrset or poolcfg/pooladm to create and bind actual processor sets consisting
of a number of processors, I have some trouble determining which of the 32 CPU "id numbers"
belong to which hardware core.
On a side note, an X4600 server with two boards lists 4 "Dual-Core AMD Opteron(tm) Processor
8218 CPU #" entries in prtdiag, but 8 "cpu (driver not attached)" entries in prtconf, and
Solaris recognizes 8 processors in pooladm. Again, there's no clue which of these 8 processor
cores belongs to which socket, and this information could be important (or at least interesting)
for SMP vs. NUMA comparison within otherwise the same platform.
So far the nearest ideas I got were from some blog posts about pooladm which suggested to
make a CPU set for a worker zone with CPU IDs 0-28, and moving hardware interrupts to CPU
IDs 29-31. I could not determine whether these are single strands of separate cores, or 3 of 4
strands on a single core, or some random 3 strands how-ever Solaris pleases to affine them?
Is this a list defined somewhere (i.e. IDs 0-3 belong to core 0, IDs 4-7 belong to core 1 and so
on, according to Document X) or can this be determined at runtime (prtdiag/prtconf)?
Is this a fixed list or can the "strand number-CPU core" relations change over time/reboots?
Perhaps, does Solaris or underlying hardware deliberately hide this knowledge from the OS
administrators/users (if so, what is the rationale)?
Finally, am I correct to believe I can place specific CPU IDs into specific psets via pooladm?
Looking at /etc/pooladm.conf I think this is true (the default pool lists all CPU IDs of the
system), but wanted some solid confirmation :)
Thanks for any ideas,
//Jim