How to get number of physical CPU in linux from user space?
It seems that /proc/cpuinfo will return the number of logical CPU. If the machine has Intel Hyper-Thread enabled, that number is bigger than physical CPU number. Usually twice as big.
My question is, what is the reliable way for user space program to detect the number of physical CPU in the current machine?
If in it is in the kernel, I can read from cpu_sibling_map[] or phys_cpu_id[]. But it seems not easy read that from user space.
Of course I can do "gdb /proc/kcore" to get them. But is there any better way?
Thanks in advance.
Chris
I rebuilt 2.5.44 with the ACPI stuff enabled, and I see 2 cpus in /proc/cpuinfo:
daedalus@hercules daedalus $ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) XEON(TM) CPU 2.20GHz
stepping : 4
cpu MHz : 2200.469
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 4341.76
processor : 1
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) XEON(TM) CPU 2.20GHz
stepping : 4
cpu MHz : 2200.469
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 4390.91
Also dmesg says:
daedalus@hercules daedalus $ dmesg
1462.55 usecs.
task migration cache decay timeout: 2 msecs.
enabled ExtINT on CPU#0
ESR value before enabling vector: 00000000
ESR value after enabling vector: 00000000
Booting processor 1/1 eip 2000
Initializing CPU#1
masked ExtINT on CPU#1
ESR value before enabling vector: 00000000
ESR value after enabling vector: 00000000
Calibrating delay loop... 4390.91 BogoMIPS
CPU: Before vendor init, caps: 3febfbff 00000000 00000000, vendor = 0
CPU: Trace cache: 12K uops, L1 D cache: 8K
CPU: L2 cache: 512K
CPU: Physical Processor ID: 0
CPU: After vendor init, caps: 3febfbff 00000000 00000000 00000000 Intel machine check reporting enabled on CPU#1.
CPU#1: Intel P4/Xeon Extended MCE MSRs (12) available CPU#1: Thermal monitoring enabled
CPU: After generic, caps: 3febfbff 00000000 00000000 00000000
CPU: Common caps: 3febfbff 00000000 00000000 00000000
CPU1: Intel(R) XEON(TM) CPU 2.20GHz stepping 04
Total of 2 processors activated (8732.67 BogoMIPS).
And a bit further down...
checking TSC synchronization across 2 CPUs: passed. Starting migration thread for cpu 0 Bringing up 1
CPU 1 IS NOW UP!
Starting migration thread for cpu 1
CPUS done 4294967295
And down some more we seem to have 4 cpus...
ACPI: Processor [CPU0] (supports C1)
ACPI: Processor [CPU1] (supports C1)
ACPI: Processor [CPU2] (supports C1)
ACPI: Processor [CPU3] (supports C1)
I think with ACPI disabled I had 4 processors listed in /proc/cpuinfo, but I'll check.
Quoted 28 lines · [email protected] wrote:
It seems that
/proc/cpuinfowill return the number of logical CPU. If the machine has Intel Hyper-Thread enabled, that number is bigger than physical CPU number. Usually twice as big.My question is, what is the reliable way for user space program to detect the number of physical CPU in the current machine?
If in it is in the kernel, I can read from cpu_sibling_map[] or phys_cpu_id[]. But it seems not easy read that from user space.
Of course I can do "gdb
/proc/kcore" to get them. But is there any better way?Thanks in advance.
Chris
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 6 lines · On Fri, 2002-10-25 at 00:02, [email protected] wrote:
It seems that
/proc/cpuinfowill return the number of logical CPU. If the machine has Intel Hyper-Thread enabled, that number is bigger than physical CPU number. Usually twice as big.My question is, what is the reliable way for user space program to detect the number of physical CPU in the current machine?
I believe there was talk about representing the CPUs in driverfs somehow. Not sure of the details though...
Signature · 3 lines
// Gianni Tedesco (gianni at ecsc dot co dot uk) lynx --source www.scaramanga.co.uk/gianni-at-ecsc.asc | gpg --import 8646BE7D: 6D9F 2287 870E A2C9 8F60 3A3C 91B5 7669 8646 BE7D
Define "physical CPU number" ;-) If you want to deteact which ones are paired up, I believe that if all but the last bit of the apicid is the same, they're siblings. You might have to dig the apicid out of the bootlog if the cpuinfo stuff doesn't tell you.
M.
Quoted 27 lines · --On Thursday, October 24, 2002 4:02 PM -0700 [email protected] wrote:
It seems that
/proc/cpuinfowill return the number of logical CPU. If the machine has Intel Hyper-Thread enabled, that number is bigger than physical CPU number. Usually twice as big.My question is, what is the reliable way for user space program to detect the number of physical CPU in the current machine?
If in it is in the kernel, I can read from cpu_sibling_map[] or phys_cpu_id[]. But it seems not easy read that from user space.
Of course I can do "gdb
/proc/kcore" to get them. But is there any better way?Thanks in advance.
Chris
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 1 line · Martin J. Bligh
Define "physical CPU number" ;-) If you want to deteact which
I mean the number of cpu chip you can count on the mother board.
Quoted 4 lines
ones are paired up, I believe that if all but the last bit of the apicid is the same, they're siblings. You might have to dig the apicid out of the bootlog if the cpuinfo stuff doesn't tell you.
And you are right. Those apicid, after mask out the siblings, are put in phys_cpu_id[] array in kernel.
I think about look at bootlog too, but that is not a reliable way because bootlog might already been flush out after some time.
Cheers
Chris
Quoted 31 lines · [email protected] wrote:
Quoted 3 lines · Martin J. Bligh
Define "physical CPU number" ;-) If you want to deteact which
I mean the number of cpu chip you can count on the mother board.
Quoted 6 lines
ones are paired up, I believe that if all but the last bit of the apicid is the same, they're siblings. You might have to dig the apicid out of the bootlog if the cpuinfo stuff doesn't tell you.
And you are right. Those apicid, after mask out the siblings, are put in phys_cpu_id[] array in kernel.
I think about look at bootlog too, but that is not a reliable way because bootlog might already been flush out after some time.
Cheers
Chris
Quoted 7 lines
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Here is what RedHat does in some of their SRPMS to check if you have multiple CPUs on your build machine so they can do some parallel builds to speed up the build process (kernel, glibc, etc):
egrep -c "^cpu[0-9]+" /proc/stat || :
Quoted 7 lines
Quoted 4 lines
ones are paired up, I believe that if all but the last bit of the apicid is the same, they're siblings. You might have to dig the apicid out of the bootlog if the cpuinfo stuff doesn't tell you.
And you are right. Those apicid, after mask out the siblings, are put in phys_cpu_id[] array in kernel.
Probably best to just hack /proc/cpuinfo output to include the apicid.
M.
Quoted 7 lines · On Thu, Oct 24, 2002 at 04:02:29PM -0700, [email protected] wrote:
It seems that
/proc/cpuinfowill return the number of logical CPU. If the machine has Intel Hyper-Thread enabled, that number is bigger than physical CPU number. Usually twice as big.My question is, what is the reliable way for user space program to detect the number of physical CPU in the current machine?
Quoted 6 lines
If in it is in the kernel, I can read from cpu_sibling_map[] or phys_cpu_id[]. But it seems not easy read that from user space.
Of course I can do "gdb
/proc/kcore" to get them. But is there any better way?
You can perform cpuid instructions in userspace to get the number of siblings per physical package.
Signature · 1 line
| Dave Jones. http://www.codemonkey.org.uk
Quoted 4 lines · Dave Jones
You can perform cpuid instructions in userspace to get the number of siblings per physical package.
Sure. But the problem is that we don't know for sure how many of the sibling was enable in the kernel. Kernel support up to 2 siblings right now, but it might be more in later kernel. And user might turn off sibling in kernel.
So divide the number of cpu in cpuinfo by number of siblings per physical package do not work reliable.
Any comment to add one entry into /proc/cpuinfo to tell which physical cpu it belong to? I don't mind submit a patch. It will be something look like:
processor : 2
physical cpu : 1
Cheers
Chris