CPU: better compatibility for Intel CPUs

This commit is contained in:
李通洲
2024-05-19 18:23:18 +08:00
parent 1b4fc38330
commit 81485baadb
4 changed files with 20 additions and 24 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ typedef struct FFCPUResult
double frequencyMax; // GHz
double frequencyMin; // GHz
FFCPUCore coreTypes[8]; // number of P cores, E cores, etc.
FFCPUCore coreTypes[16]; // number of P cores, E cores, etc.
double temperature;
} FFCPUResult;
+4 -5
View File
@@ -56,12 +56,11 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
if (!(cpu->frequencyMin <= fmin)) cpu->frequencyMin = fmin; // Counting for NaN
if (!(cpu->frequencyMax >= fmax)) cpu->frequencyMax = fmax;
if (cpu->coreTypes[ifreq].freq != fmax)
{
if (cpu->coreTypes[ifreq].count && ifreq < sizeof(cpu->coreTypes) / sizeof(cpu->coreTypes[0]))
++ifreq;
uint32_t ifreq = 0;
while (cpu->coreTypes[ifreq].freq != fmax && cpu->coreTypes[ifreq].freq > 0)
++ifreq;
if (cpu->coreTypes[ifreq].freq == 0)
cpu->coreTypes[ifreq].freq = fmax;
}
cpu->coreTypes[ifreq].count++;
}
}
+8 -9
View File
@@ -136,7 +136,6 @@ static bool detectFrequency(FFCPUResult* cpu)
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
uint32_t baseLen = path.length;
uint32_t ifreq = 0;
struct dirent* entry;
while ((entry = readdir(dir)) != NULL)
{
@@ -158,14 +157,6 @@ static bool detectFrequency(FFCPUResult* cpu)
cpu->frequencyMax = cpu->frequencyMax > fmax ? cpu->frequencyMax : fmax;
else
cpu->frequencyMax = fmax;
if (cpu->coreTypes[ifreq].freq != fmax)
{
if (cpu->coreTypes[ifreq].count && ifreq < sizeof(cpu->coreTypes) / sizeof(cpu->coreTypes[0]))
++ifreq;
cpu->coreTypes[ifreq].freq = fmax;
}
cpu->coreTypes[ifreq].count += getNumCores(&path, &buffer);
}
uint32_t fmin = getFrequency(&path, "/cpuinfo_min_freq", "/scaling_min_freq", &buffer);
if (fmin > 0)
@@ -175,6 +166,14 @@ static bool detectFrequency(FFCPUResult* cpu)
else
cpu->frequencyMin = fmin;
}
uint32_t freq = fbase <= 0 ? fmax : fbase; // seems base frequencies are more stable
uint32_t ifreq = 0;
while (cpu->coreTypes[ifreq].freq != freq && cpu->coreTypes[ifreq].freq > 0)
++ifreq;
if (cpu->coreTypes[ifreq].freq == 0)
cpu->coreTypes[ifreq].freq = freq;
cpu->coreTypes[ifreq].count += getNumCores(&path, &buffer);
ffStrbufSubstrBefore(&path, baseLen);
}
}
+7 -9
View File
@@ -166,16 +166,14 @@ static const char* detectCoreTypes(FFCPUResult* cpu)
if (!NT_SUCCESS(NtPowerInformation(ProcessorInformation, NULL, 0, pinfo, (ULONG) sizeof(PROCESSOR_POWER_INFORMATION) * cpu->coresLogical)))
return "NtPowerInformation(ProcessorInformation, NULL, 0, pinfo, size) failed";
uint32_t ifreq = 0;
for (uint32_t i = 0; i < cpu->coresLogical && pinfo[i].MhzLimit; ++i)
for (uint32_t icore = 0; icore < cpu->coresLogical && pinfo[icore].MhzLimit; ++icore)
{
if (cpu->coreTypes[ifreq].freq != pinfo[i].MhzLimit)
{
if (cpu->coreTypes[ifreq].count && ifreq < sizeof(cpu->coreTypes) / sizeof(cpu->coreTypes[0]))
++ifreq;
cpu->coreTypes[ifreq].freq = pinfo[i].MhzLimit;
}
cpu->coreTypes[ifreq].count++;
uint32_t ifreq = 0;
while (cpu->coreTypes[ifreq].freq != pinfo[icore].MhzLimit && cpu->coreTypes[ifreq].freq > 0)
++ifreq;
if (cpu->coreTypes[ifreq].freq == 0)
cpu->coreTypes[ifreq].freq = pinfo[icore].MhzLimit;
++cpu->coreTypes[ifreq].count;
}
if (cpu->frequencyBase != cpu->frequencyBase)