|
10 | 10 | from enum import Enum |
11 | 11 | from itertools import product |
12 | 12 | from pathlib import Path |
| 13 | +from psutil import Process |
13 | 14 |
|
14 | 15 | from git_project import GitProject |
15 | 16 | from options import options |
@@ -417,6 +418,24 @@ def run( |
417 | 418 | command += self.bin_args(run_trace) |
418 | 419 | env_vars.update(self.extra_env_vars()) |
419 | 420 |
|
| 421 | + # Pin compute benchmarks to a CPU cores set to ensure consistent results |
| 422 | + # and non-zero CPU count measurements (e.g. avoid E-cores). 4 max freq cores |
| 423 | + # are pinned by default to satisfy multiple threads benchmarks. |
| 424 | + available_cores = Process().cpu_affinity() |
| 425 | + # Get 4 cores with the highest available frequency. |
| 426 | + core_frequencies = [] |
| 427 | + for core in available_cores: |
| 428 | + with open( |
| 429 | + f"/sys/devices/system/cpu/cpu{core}/cpufreq/cpuinfo_max_freq" |
| 430 | + ) as f: |
| 431 | + freq = int(f.read().strip()) |
| 432 | + core_frequencies.append((core, freq)) |
| 433 | + core_frequencies.sort(key=lambda x: x[1], reverse=True) |
| 434 | + available_cores = [core for core, _ in core_frequencies[:4]] |
| 435 | + cores_list = ",".join([str(core) for core in available_cores]) |
| 436 | + |
| 437 | + command = ["taskset", "-c", cores_list] + command |
| 438 | + |
420 | 439 | result = self.run_bench( |
421 | 440 | command, env_vars, run_trace=run_trace, force_trace=force_trace |
422 | 441 | ) |
|
0 commit comments