summaryrefslogtreecommitdiffstats
path: root/Source/kwsys
diff options
context:
space:
mode:
authorFrancois Bertel <francois.bertel@kitware.com>2008-05-31 15:23:15 (GMT)
committerFrancois Bertel <francois.bertel@kitware.com>2008-05-31 15:23:15 (GMT)
commitf9ce6fcb5a92d58993edf591065afb503ea13644 (patch)
tree679246b32df37d938406f73124932e27e4a80432 /Source/kwsys
parentd0d3c6c212bf42b40dc84a1c5b8eda0793526a51 (diff)
downloadCMake-f9ce6fcb5a92d58993edf591065afb503ea13644.zip
CMake-f9ce6fcb5a92d58993edf591065afb503ea13644.tar.gz
CMake-f9ce6fcb5a92d58993edf591065afb503ea13644.tar.bz2
BUG:Fixed NumberOfLogicalCPU, NumberOfPhysicalCPU and LogicalProcessorsPerPhysical under Linux. Some part was just wrong. Some other part missed to take the multicore value into account.
Diffstat (limited to 'Source/kwsys')
-rw-r--r--Source/kwsys/SystemInformation.cxx40
1 files changed, 24 insertions, 16 deletions
diff --git a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx
index 058fddd..1592237 100644
--- a/Source/kwsys/SystemInformation.cxx
+++ b/Source/kwsys/SystemInformation.cxx
@@ -2161,38 +2161,46 @@ int SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
buffer.resize(fileSize-2);
- // Number of CPUs
+ // Number of logical CPUs (combination of multiple processors, multi-core
+ // and hyperthreading)
size_t pos = buffer.find("processor\t");
while(pos != buffer.npos)
{
this->NumberOfLogicalCPU++;
- this->NumberOfPhysicalCPU++;
pos = buffer.find("processor\t",pos+1);
}
- // Count the number of physical ids that are the same
- int currentId = -1;
- kwsys_stl::string idc = this->ExtractValueFromCpuInfoFile(buffer,"physical id");
-
+ // Find the largest physical id.
+ int maxId = -1;
+ kwsys_stl::string idc =
+ this->ExtractValueFromCpuInfoFile(buffer,"physical id");
while(this->CurrentPositionInFile != buffer.npos)
{
- int id = atoi(idc.c_str());
- if(id == currentId)
+ int id = atoi(idc.c_str());
+ if(id > maxId)
{
- this->NumberOfPhysicalCPU--;
+ maxId=id;
}
- currentId = id;
- idc = this->ExtractValueFromCpuInfoFile(buffer,"physical id",this->CurrentPositionInFile+1);
+ idc = this->ExtractValueFromCpuInfoFile(buffer,"physical id",
+ this->CurrentPositionInFile+1);
}
- if(this->NumberOfPhysicalCPU>0)
- {
- this->NumberOfLogicalCPU /= this->NumberOfPhysicalCPU;
- }
+ // Physical ids returned by Linux don't distinguish cores.
+ // We want to record the total number of cores in this->NumberOfPhysicalCPU
+ // (checking only the first proc)
+ kwsys_stl::string cores =
+ this->ExtractValueFromCpuInfoFile(buffer,"cpu cores");
+ int numberOfCoresPerCPU=atoi(cores.c_str());
+
+ this->NumberOfPhysicalCPU=numberOfCoresPerCPU*(maxId+1);
+
+ // LogicalProcessorsPerPhysical>1 => hyperthreading.
+ this->Features.ExtendedFeatures.LogicalProcessorsPerPhysical=
+ this->NumberOfLogicalCPU/this->NumberOfPhysicalCPU;
// CPU speed (checking only the first proc
kwsys_stl::string CPUSpeed = this->ExtractValueFromCpuInfoFile(buffer,"cpu MHz");
- this->CPUSpeedInMHz = (float)atof(CPUSpeed.c_str());
+ this->CPUSpeedInMHz = static_cast<float>(atof(CPUSpeed.c_str()));
// Chip family
this->ChipID.Family = atoi(this->ExtractValueFromCpuInfoFile(buffer,"cpu family").c_str());