diff options
author | Francois Bertel <francois.bertel@kitware.com> | 2008-05-31 15:23:15 (GMT) |
---|---|---|
committer | Francois Bertel <francois.bertel@kitware.com> | 2008-05-31 15:23:15 (GMT) |
commit | f9ce6fcb5a92d58993edf591065afb503ea13644 (patch) | |
tree | 679246b32df37d938406f73124932e27e4a80432 /Source/kwsys | |
parent | d0d3c6c212bf42b40dc84a1c5b8eda0793526a51 (diff) | |
download | CMake-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.cxx | 40 |
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()); |