diff --git a/SystemInformation.cxx b/SystemInformation.cxx index 19cb80da5253d75346e7cdaaa709d0b2361115c1..08be90fce63e1f07617a65c3b5cdf6496fcc4a36 100644 --- a/SystemInformation.cxx +++ b/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()); diff --git a/kwsysDateStamp.cmake b/kwsysDateStamp.cmake index c5bdfc2657d4b72fcad39f4192be3b70034c1e75..fad7d0ba1aaa4cf7f2ba7f84bbca2115cecccc98 100644 --- a/kwsysDateStamp.cmake +++ b/kwsysDateStamp.cmake @@ -7,4 +7,4 @@ SET(KWSYS_DATE_STAMP_YEAR 2008) SET(KWSYS_DATE_STAMP_MONTH 05) # KWSys version date day component. Format is DD. -SET(KWSYS_DATE_STAMP_DAY 27) +SET(KWSYS_DATE_STAMP_DAY 31)