Skip to content

Commit 81485ba

Browse files
committed
CPU: better compatibility for Intel CPUs
1 parent 1b4fc38 commit 81485ba

File tree

4 files changed

+20
-24
lines changed

4 files changed

+20
-24
lines changed

src/detection/cpu/cpu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ typedef struct FFCPUResult
2323
double frequencyMax; // GHz
2424
double frequencyMin; // GHz
2525

26-
FFCPUCore coreTypes[8]; // number of P cores, E cores, etc.
26+
FFCPUCore coreTypes[16]; // number of P cores, E cores, etc.
2727

2828
double temperature;
2929
} FFCPUResult;

src/detection/cpu/cpu_bsd.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,11 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
5656
if (!(cpu->frequencyMin <= fmin)) cpu->frequencyMin = fmin; // Counting for NaN
5757
if (!(cpu->frequencyMax >= fmax)) cpu->frequencyMax = fmax;
5858

59-
if (cpu->coreTypes[ifreq].freq != fmax)
60-
{
61-
if (cpu->coreTypes[ifreq].count && ifreq < sizeof(cpu->coreTypes) / sizeof(cpu->coreTypes[0]))
62-
++ifreq;
59+
uint32_t ifreq = 0;
60+
while (cpu->coreTypes[ifreq].freq != fmax && cpu->coreTypes[ifreq].freq > 0)
61+
++ifreq;
62+
if (cpu->coreTypes[ifreq].freq == 0)
6363
cpu->coreTypes[ifreq].freq = fmax;
64-
}
6564
cpu->coreTypes[ifreq].count++;
6665
}
6766
}

src/detection/cpu/cpu_linux.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ static bool detectFrequency(FFCPUResult* cpu)
136136
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
137137
uint32_t baseLen = path.length;
138138

139-
uint32_t ifreq = 0;
140139
struct dirent* entry;
141140
while ((entry = readdir(dir)) != NULL)
142141
{
@@ -158,14 +157,6 @@ static bool detectFrequency(FFCPUResult* cpu)
158157
cpu->frequencyMax = cpu->frequencyMax > fmax ? cpu->frequencyMax : fmax;
159158
else
160159
cpu->frequencyMax = fmax;
161-
162-
if (cpu->coreTypes[ifreq].freq != fmax)
163-
{
164-
if (cpu->coreTypes[ifreq].count && ifreq < sizeof(cpu->coreTypes) / sizeof(cpu->coreTypes[0]))
165-
++ifreq;
166-
cpu->coreTypes[ifreq].freq = fmax;
167-
}
168-
cpu->coreTypes[ifreq].count += getNumCores(&path, &buffer);
169160
}
170161
uint32_t fmin = getFrequency(&path, "/cpuinfo_min_freq", "/scaling_min_freq", &buffer);
171162
if (fmin > 0)
@@ -175,6 +166,14 @@ static bool detectFrequency(FFCPUResult* cpu)
175166
else
176167
cpu->frequencyMin = fmin;
177168
}
169+
170+
uint32_t freq = fbase <= 0 ? fmax : fbase; // seems base frequencies are more stable
171+
uint32_t ifreq = 0;
172+
while (cpu->coreTypes[ifreq].freq != freq && cpu->coreTypes[ifreq].freq > 0)
173+
++ifreq;
174+
if (cpu->coreTypes[ifreq].freq == 0)
175+
cpu->coreTypes[ifreq].freq = freq;
176+
cpu->coreTypes[ifreq].count += getNumCores(&path, &buffer);
178177
ffStrbufSubstrBefore(&path, baseLen);
179178
}
180179
}

src/detection/cpu/cpu_windows.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,14 @@ static const char* detectCoreTypes(FFCPUResult* cpu)
166166
if (!NT_SUCCESS(NtPowerInformation(ProcessorInformation, NULL, 0, pinfo, (ULONG) sizeof(PROCESSOR_POWER_INFORMATION) * cpu->coresLogical)))
167167
return "NtPowerInformation(ProcessorInformation, NULL, 0, pinfo, size) failed";
168168

169-
uint32_t ifreq = 0;
170-
for (uint32_t i = 0; i < cpu->coresLogical && pinfo[i].MhzLimit; ++i)
169+
for (uint32_t icore = 0; icore < cpu->coresLogical && pinfo[icore].MhzLimit; ++icore)
171170
{
172-
if (cpu->coreTypes[ifreq].freq != pinfo[i].MhzLimit)
173-
{
174-
if (cpu->coreTypes[ifreq].count && ifreq < sizeof(cpu->coreTypes) / sizeof(cpu->coreTypes[0]))
175-
++ifreq;
176-
cpu->coreTypes[ifreq].freq = pinfo[i].MhzLimit;
177-
}
178-
cpu->coreTypes[ifreq].count++;
171+
uint32_t ifreq = 0;
172+
while (cpu->coreTypes[ifreq].freq != pinfo[icore].MhzLimit && cpu->coreTypes[ifreq].freq > 0)
173+
++ifreq;
174+
if (cpu->coreTypes[ifreq].freq == 0)
175+
cpu->coreTypes[ifreq].freq = pinfo[icore].MhzLimit;
176+
++cpu->coreTypes[ifreq].count;
179177
}
180178

181179
if (cpu->frequencyBase != cpu->frequencyBase)

0 commit comments

Comments
 (0)