[Runtime] Refactor sysfs testdata capture (#24823)
Removes the sysfs capture archive in favor of plain text files and adds
more testdata.
- Refactored capture_sysfs to produce a single text file which can be
expanded into sysfs layout
- Removed the pixel archive -> arm64_pixel6_tensor.sysfs.txt
- Added more captures relating to #24761
Co-Authored-By: Claude
Signed-off-by: Tobias Fuchs <fuchs@roofline.ai>
diff --git a/runtime/src/iree/task/testdata/sysfs/.gitignore b/runtime/src/iree/task/testdata/sysfs/.gitignore
index 951b602..a5f0927 100644
--- a/runtime/src/iree/task/testdata/sysfs/.gitignore
+++ b/runtime/src/iree/task/testdata/sysfs/.gitignore
@@ -1,8 +1,4 @@
-# Ignore all extracted sysfs snapshot directories.
-# Only tar.gz archives should be checked in.
-
-# Allow tar.gz archives (override root .gitignore).
-!*.tar.gz
-
-# Ignore all directories.
-*/
+# Locally captured snapshots and expansions (capture_sysfs.sh default output)
+# are not checked in; curated manifests like arm64_pixel6_tensor.sysfs.txt are
+# committed as plain text.
+captured_*
diff --git a/runtime/src/iree/task/testdata/sysfs/README.md b/runtime/src/iree/task/testdata/sysfs/README.md
index 53e126b..e467303 100644
--- a/runtime/src/iree/task/testdata/sysfs/README.md
+++ b/runtime/src/iree/task/testdata/sysfs/README.md
@@ -1,23 +1,27 @@
# Sysfs CPU Topology Test Data
-This directory contains snapshots of `/sys/devices/system/cpu/` directory
-structures from various systems. These snapshots are used to test the
-`topology_sysfs.c` implementation without requiring physical hardware access.
+This directory contains snapshots of `/sys/devices/system/` from various
+machines, used to test the sysfs topology implementation without requiring
+physical hardware access.
-**Note:** Test data is stored as compressed tar.gz archives to minimize
-repository size. Extract archives before testing:
-
-```bash
-tar xzf arm64_pixel6_tensor.tar.gz
-```
-
-We only check in small weird configurations (like ARM) for smoke testing and
-manual debugging. Large x86 systems can be thousands of files and megabytes of
-text - capture those locally for testing but don't check them in.
+Each snapshot is a single plain-text manifest, `<name>.sysfs.txt`,
+with one `relative/path=content` line per sysfs file (plus `#` comments). Consumers regenerate the sysfs-shaped directory tree via `capture_sysfs.sh --expand`.
## Test Configurations
-### arm64_pixel6_tensor/
+### synthetic_*.sysfs.txt
+
+Synthesized topologies; each manifest's header comments describe the machine
+shape and the failure mode it guards against.
+
+### x86_64_ryzen9_7950x.sysfs.txt
+
+**Hardware:** AMD Ryzen 9 7950X (captured). 16 cores / 32 SMT threads with
+non-adjacent sibling pairs (cpuN + cpuN+16), two 8-core CCDs with private 32M
+L3 each, one NUMA node, and `cluster_id` reporting the 65535 sentinel on every
+cpu.
+
+### arm64_pixel6_tensor.sysfs.txt
**Hardware:** Google Pixel 6 (Google Tensor GS101)
**Architecture:** ARM64
@@ -32,7 +36,11 @@
- A55: L1 32KB, L2 128KB, L3 4MB (shared 4-7)
**Expected Behavior:**
-- Should detect 3 clusters based on cluster_id
+- Should detect a single NUMA node: node identity comes from
+ `/sys/devices/system/node/` (a single node here), falling back to
+ `physical_package_id`, and is NOT taken from the `cluster_id` L2 domains.
+ Big/LITTLE selection is expressed through the performance level, not by
+ splitting the machine into per-cluster nodes.
- With 75% capacity threshold (768):
- HIGH performance: CPUs 0-1, 2-3 (capacity >= 768)
- LOW performance: CPUs 4-7 (capacity < 768)
@@ -41,22 +49,33 @@
## Capturing New Test Data
-Use the `capture_sysfs.sh` script to create snapshots from real systems:
+Use the `capture_sysfs.sh` script to create snapshot manifests from real
+systems:
```bash
-# Capture current system to a new directory
-./capture_sysfs.sh my_system_name
+# Capture current system to a manifest
+./capture_sysfs.sh my_system_name.sysfs.txt
# Capture with automatic timestamped name
./capture_sysfs.sh
+
+# Expand a manifest back into a sysfs-shaped directory tree (for tools)
+./capture_sysfs.sh --expand my_system_name.sysfs.txt /tmp/my_system_name
```
-The script captures:
-- Top-level CPU list files (`present`, `possible`, `online`, etc.)
-- Per-CPU topology (`core_id`, `cluster_id`, `physical_package_id`, etc.)
+The script captures the sysfs topology:
+- CPU enumeration (`cpu/present`, `cpu/kernel_max` fallback)
+- NUMA node hierarchy (`node/online`, `node/node<N>/cpulist`) — the primary
+ source of node identity; captures sub-NUMA clustering on SNC/NPS machines
+- Per-CPU topology (`core_id`, `physical_package_id`, `cluster_id`,
+ `core_cpus_list`, `thread_siblings_list`)
- Per-CPU cache hierarchy (`type`, `level`, `size`, `shared_cpu_list`)
- ARM-specific files (`cpu_capacity` for big.LITTLE detection)
+The script keeps `thread_siblings_list` because pre-5.3 kernels don't expose
+`core_cpus_list`; when a capture contains both, the `thread_siblings_list`
+lines are redundant (the backend prefers `core_cpus_list`).
+
## Testing with Snapshots
To test with sysfs snapshots, compile IREE with the `IREE_SYSFS_ROOT` define
@@ -123,9 +142,6 @@
- **Unusual configurations:** Hybrid x86 (Intel Alder Lake P/E cores), RISC-V SMP - check in if interesting
When adding new test data:
-1. Run `capture_sysfs.sh <directory_name>` on the target hardware
-2. Compress the directory: `tar czf <directory_name>.tar.gz <directory_name>/`
-3. Test the snapshot to ensure it exercises the intended code paths
-4. **Only check in tar.gz if small and interesting** (ARM heterogeneous, exotic architectures)
+1. Run `capture_sysfs.sh <name>.sysfs.txt` on the target hardware
+2. Test the manifest to ensure it exercises the intended code paths
5. Update this README with hardware details and expected behavior if checking in
-6. Large x86 systems stay local - don't commit multi-MB tar files
diff --git a/runtime/src/iree/task/testdata/sysfs/arm64_pixel6_tensor.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/arm64_pixel6_tensor.sysfs.txt
new file mode 100644
index 0000000..c77a86f
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/arm64_pixel6_tensor.sysfs.txt
@@ -0,0 +1,141 @@
+# Google Pixel 6 (Google Tensor GS101) sysfs topology snapshot.
+# Format: one 'relative/path=content' line per sysfs file; expand with
+# ./capture_sysfs.sh --expand <this file> <destdir>
+# or point --task_topology_sysfs_root= at an expansion.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=512K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/cache/index2/level=3
+cpu/cpu0/cache/index2/shared_cpu_list=0-1
+cpu/cpu0/cache/index2/size=4096K
+cpu/cpu0/cache/index2/type=Unified
+cpu/cpu0/cpu_capacity=1024
+cpu/cpu0/topology/cluster_id=0
+cpu/cpu0/topology/core_cpus_list=0
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=512K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/cache/index2/level=3
+cpu/cpu1/cache/index2/shared_cpu_list=0-1
+cpu/cpu1/cache/index2/size=4096K
+cpu/cpu1/cache/index2/type=Unified
+cpu/cpu1/cpu_capacity=1024
+cpu/cpu1/topology/cluster_id=0
+cpu/cpu1/topology/core_cpus_list=1
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=256K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/cache/index2/level=3
+cpu/cpu2/cache/index2/shared_cpu_list=2-3
+cpu/cpu2/cache/index2/size=4096K
+cpu/cpu2/cache/index2/type=Unified
+cpu/cpu2/cpu_capacity=820
+cpu/cpu2/topology/cluster_id=1
+cpu/cpu2/topology/core_cpus_list=2
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=256K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/cache/index2/level=3
+cpu/cpu3/cache/index2/shared_cpu_list=2-3
+cpu/cpu3/cache/index2/size=4096K
+cpu/cpu3/cache/index2/type=Unified
+cpu/cpu3/cpu_capacity=820
+cpu/cpu3/topology/cluster_id=1
+cpu/cpu3/topology/core_cpus_list=3
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/shared_cpu_list=4
+cpu/cpu4/cache/index0/size=32K
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index1/level=2
+cpu/cpu4/cache/index1/shared_cpu_list=4
+cpu/cpu4/cache/index1/size=128K
+cpu/cpu4/cache/index1/type=Unified
+cpu/cpu4/cache/index2/level=3
+cpu/cpu4/cache/index2/shared_cpu_list=4-7
+cpu/cpu4/cache/index2/size=4096K
+cpu/cpu4/cache/index2/type=Unified
+cpu/cpu4/cpu_capacity=280
+cpu/cpu4/topology/cluster_id=2
+cpu/cpu4/topology/core_cpus_list=4
+cpu/cpu4/topology/core_id=4
+cpu/cpu4/topology/physical_package_id=0
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/shared_cpu_list=5
+cpu/cpu5/cache/index0/size=32K
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index1/level=2
+cpu/cpu5/cache/index1/shared_cpu_list=5
+cpu/cpu5/cache/index1/size=128K
+cpu/cpu5/cache/index1/type=Unified
+cpu/cpu5/cache/index2/level=3
+cpu/cpu5/cache/index2/shared_cpu_list=4-7
+cpu/cpu5/cache/index2/size=4096K
+cpu/cpu5/cache/index2/type=Unified
+cpu/cpu5/cpu_capacity=280
+cpu/cpu5/topology/cluster_id=2
+cpu/cpu5/topology/core_cpus_list=5
+cpu/cpu5/topology/core_id=5
+cpu/cpu5/topology/physical_package_id=0
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/shared_cpu_list=6
+cpu/cpu6/cache/index0/size=32K
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index1/level=2
+cpu/cpu6/cache/index1/shared_cpu_list=6
+cpu/cpu6/cache/index1/size=128K
+cpu/cpu6/cache/index1/type=Unified
+cpu/cpu6/cache/index2/level=3
+cpu/cpu6/cache/index2/shared_cpu_list=4-7
+cpu/cpu6/cache/index2/size=4096K
+cpu/cpu6/cache/index2/type=Unified
+cpu/cpu6/cpu_capacity=280
+cpu/cpu6/topology/cluster_id=2
+cpu/cpu6/topology/core_cpus_list=6
+cpu/cpu6/topology/core_id=6
+cpu/cpu6/topology/physical_package_id=0
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/shared_cpu_list=7
+cpu/cpu7/cache/index0/size=32K
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index1/level=2
+cpu/cpu7/cache/index1/shared_cpu_list=7
+cpu/cpu7/cache/index1/size=128K
+cpu/cpu7/cache/index1/type=Unified
+cpu/cpu7/cache/index2/level=3
+cpu/cpu7/cache/index2/shared_cpu_list=4-7
+cpu/cpu7/cache/index2/size=4096K
+cpu/cpu7/cache/index2/type=Unified
+cpu/cpu7/cpu_capacity=280
+cpu/cpu7/topology/cluster_id=2
+cpu/cpu7/topology/core_cpus_list=7
+cpu/cpu7/topology/core_id=7
+cpu/cpu7/topology/physical_package_id=0
+cpu/present=0-7
diff --git a/runtime/src/iree/task/testdata/sysfs/arm64_pixel6_tensor.tar.gz b/runtime/src/iree/task/testdata/sysfs/arm64_pixel6_tensor.tar.gz
deleted file mode 100644
index cb9c78e..0000000
--- a/runtime/src/iree/task/testdata/sysfs/arm64_pixel6_tensor.tar.gz
+++ /dev/null
Binary files differ
diff --git a/runtime/src/iree/task/testdata/sysfs/capture_sysfs.sh b/runtime/src/iree/task/testdata/sysfs/capture_sysfs.sh
index f3f5076..36bafde 100755
--- a/runtime/src/iree/task/testdata/sysfs/capture_sysfs.sh
+++ b/runtime/src/iree/task/testdata/sysfs/capture_sysfs.sh
@@ -1,100 +1,125 @@
#!/usr/bin/env bash
-# Copyright 2025 The IREE Authors
+# Copyright 2026 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-# Captures /sys/devices/system/cpu/ topology information for testing.
-# This script creates a snapshot of the current system's CPU topology that can
-# be used to test topology_sysfs.c without requiring physical hardware.
+# Captures the CPU topology of the current system as a single-file manifest.
+#
+# Manifest format: '# comment' lines plus one 'relative/path=content' line per
+# sysfs file, rooted at /sys/devices/system. Only the files topology_sysfs.c
+# reads are captured.
#
# Usage:
-# ./capture_sysfs.sh [destination_dir]
+# ./capture_sysfs.sh [manifest_file] # capture this machine
+# ./capture_sysfs.sh --expand <manifest> <dest_dir> # manifest -> tree
#
-# If destination_dir is not provided, it defaults to a timestamped directory.
set -e
-# Determine destination directory.
+SYSFS_ROOT="/sys/devices/system"
+
+#===------------------------------------------------------------------------===
+# --expand: manifest -> directory tree
+#===------------------------------------------------------------------------===
+if [ "$1" = "--expand" ]; then
+ MANIFEST="$2"
+ DEST="$3"
+ if [ -z "${MANIFEST}" ] || [ -z "${DEST}" ]; then
+ echo "usage: $0 --expand <manifest> <dest_dir>" >&2
+ exit 1
+ fi
+ FILE_COUNT=0
+ while IFS= read -r line; do
+ case "${line}" in
+ '' | '#'*) continue ;;
+ esac
+ path="${line%%=*}"
+ value="${line#*=}"
+ mkdir -p "${DEST}/$(dirname "${path}")"
+ printf '%s\n' "${value}" > "${DEST}/${path}"
+ FILE_COUNT=$((FILE_COUNT + 1))
+ done < "${MANIFEST}"
+ echo "Expanded ${FILE_COUNT} files from ${MANIFEST} to ${DEST}"
+ echo ""
+ exit 0
+fi
+
+#===------------------------------------------------------------------------===
+# capture: this machine -> manifest
+#===------------------------------------------------------------------------===
if [ -n "$1" ]; then
- DEST="$1"
+ OUT="$1"
else
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
HOSTNAME=$(hostname -s)
- DEST="captured_${HOSTNAME}_${TIMESTAMP}"
+ OUT="captured_${HOSTNAME}_${TIMESTAMP}.sysfs.txt"
fi
-DEST_CPU="${DEST}/cpu"
-mkdir -p "${DEST_CPU}"
+echo "Capturing sysfs CPU topology to: ${OUT}"
-echo "Capturing sysfs CPU topology to: ${DEST}"
+{
+ echo "# sysfs topology snapshot of $(hostname -s), captured $(date -u +%Y-%m-%d)."
+ echo "# Format: one 'relative/path=content' line per sysfs file; expand with"
+ echo "# ./capture_sysfs.sh --expand <this file> <destdir>"
+} > "${OUT}"
-# Copy top-level CPU files.
-for file in present possible online offline kernel_max sched_isolated isolated; do
- SRC="/sys/devices/system/cpu/${file}"
- if [ -f "${SRC}" ]; then
- cp "${SRC}" "${DEST_CPU}/" 2>/dev/null || true
+# Appends 'path=content' for one sysfs file if it exists. Sysfs values are
+# single-line; the trailing newline is stripped here and re-added on expansion.
+emit() {
+ local path="$1"
+ if [ -f "${SYSFS_ROOT}/${path}" ]; then
+ printf '%s=%s\n' "${path}" "$(tr -d '\n' < "${SYSFS_ROOT}/${path}")" \
+ >> "${OUT}"
+ fi
+}
+
+# CPU enumeration (only what topology_sysfs.c reads: present, with kernel_max
+# as its fallback).
+emit "cpu/present"
+emit "cpu/kernel_max"
+
+# NUMA node hierarchy (node/online + per-node cpulist). This is the primary
+# source of node identity for the backend.
+emit "node/online"
+for node_dir in "${SYSFS_ROOT}"/node/node[0-9]*; do
+ if [ -d "${node_dir}" ]; then
+ emit "node/$(basename "${node_dir}")/cpulist"
fi
done
-# Capture per-CPU information.
+# Per-CPU information.
CPU_COUNT=0
-for cpu_dir in /sys/devices/system/cpu/cpu[0-9]*; do
+for cpu_dir in "${SYSFS_ROOT}"/cpu/cpu[0-9]*; do
if [ ! -d "${cpu_dir}" ]; then
continue
fi
-
CPU_NAME=$(basename "${cpu_dir}")
- DEST_CPU_DIR="${DEST_CPU}/${CPU_NAME}"
- mkdir -p "${DEST_CPU_DIR}"
- # Copy cpu_capacity (ARM big.LITTLE).
- if [ -f "${cpu_dir}/cpu_capacity" ]; then
- cp "${cpu_dir}/cpu_capacity" "${DEST_CPU_DIR}/"
- fi
+ # cpu_capacity (ARM big.LITTLE).
+ emit "cpu/${CPU_NAME}/cpu_capacity"
- # Copy topology information.
- if [ -d "${cpu_dir}/topology" ]; then
- DEST_TOPO="${DEST_CPU_DIR}/topology"
- mkdir -p "${DEST_TOPO}"
- for topo_file in core_id physical_package_id cluster_id core_cpus_list thread_siblings_list; do
- SRC_FILE="${cpu_dir}/topology/${topo_file}"
- if [ -f "${SRC_FILE}" ]; then
- cp "${SRC_FILE}" "${DEST_TOPO}/"
- fi
- done
- fi
+ # Topology. thread_siblings_list is captured because pre-5.3 kernels do not
+ # expose core_cpus_list.
+ for topo_file in core_id physical_package_id cluster_id core_cpus_list thread_siblings_list; do
+ emit "cpu/${CPU_NAME}/topology/${topo_file}"
+ done
- # Copy cache hierarchy.
- if [ -d "${cpu_dir}/cache" ]; then
- DEST_CACHE="${DEST_CPU_DIR}/cache"
- mkdir -p "${DEST_CACHE}"
-
- for cache_index_dir in "${cpu_dir}"/cache/index*; do
- if [ ! -d "${cache_index_dir}" ]; then
- continue
- fi
-
+ # Cache hierarchy.
+ for cache_index_dir in "${cpu_dir}"/cache/index*; do
+ if [ -d "${cache_index_dir}" ]; then
INDEX_NAME=$(basename "${cache_index_dir}")
- DEST_INDEX="${DEST_CACHE}/${INDEX_NAME}"
- mkdir -p "${DEST_INDEX}"
-
- for cache_file in type level size coherency_line_size number_of_sets physical_line_partition shared_cpu_list; do
- SRC_FILE="${cache_index_dir}/${cache_file}"
- if [ -f "${SRC_FILE}" ]; then
- cp "${SRC_FILE}" "${DEST_INDEX}/"
- fi
+ for cache_file in type level size shared_cpu_list; do
+ emit "cpu/${CPU_NAME}/cache/${INDEX_NAME}/${cache_file}"
done
- done
- fi
+ fi
+ done
CPU_COUNT=$((CPU_COUNT + 1))
done
-echo "Successfully captured ${CPU_COUNT} CPUs to ${DEST}"
+echo "Successfully captured ${CPU_COUNT} CPUs to ${OUT}"
echo ""
-echo "To test with this snapshot:"
-echo " ./build/tools/iree-run-module \\"
-echo " --task_topology_sysfs_root=$(realpath "${DEST}") \\"
-echo " --dump_task_topologies"
+echo "To test, expand into a directory tree and point the tools at it:"
+echo " $0 --expand ${OUT} /tmp/$(basename "${OUT%.sysfs.txt}")"
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_big_little.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_big_little.sysfs.txt
new file mode 100644
index 0000000..719ab11
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_big_little.sysfs.txt
@@ -0,0 +1,49 @@
+# SYNTHETIC machine (not a hardware capture): minimal ARM big.LITTLE. Single
+# package, 2 big cores (cpu_capacity 1024) + 2 little cores (256).
+# Performance-level filtering keys off cpu_capacity with a 75%-of-max
+# threshold (768): HIGH -> cpus 0-1, LOW -> cpus 2-3, ANY -> all 4.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=256K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/cpu_capacity=1024
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=256K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/cpu_capacity=1024
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=256K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/cpu_capacity=256
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=256K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/cpu_capacity=256
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/present=0-3
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_dual_socket.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_dual_socket.sysfs.txt
new file mode 100644
index 0000000..250a7a9
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_dual_socket.sysfs.txt
@@ -0,0 +1,128 @@
+# SYNTHETIC machine (not a hardware capture): two sockets, 4 single-threaded
+# cores each (package 0 = cpu 0-3, package 1 = cpu 4-7), per-socket 8M L3, no
+# /sys/devices/system/node hierarchy (node identity = package fallback).
+# core_id restarts at 0 on each socket, exactly as x86 kernels report it:
+# topology/core_id is only unique WITHIN a package, so deduplicating physical
+# cores on it collapses socket 1 onto socket 0. core_cpus_list is present
+# (no SMT: each core is its own sibling set).
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=1024K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/cache/index2/level=3
+cpu/cpu0/cache/index2/shared_cpu_list=0-3
+cpu/cpu0/cache/index2/size=8192K
+cpu/cpu0/cache/index2/type=Unified
+cpu/cpu0/topology/core_cpus_list=0
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=1024K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/cache/index2/level=3
+cpu/cpu1/cache/index2/shared_cpu_list=0-3
+cpu/cpu1/cache/index2/size=8192K
+cpu/cpu1/cache/index2/type=Unified
+cpu/cpu1/topology/core_cpus_list=1
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=1024K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/cache/index2/level=3
+cpu/cpu2/cache/index2/shared_cpu_list=0-3
+cpu/cpu2/cache/index2/size=8192K
+cpu/cpu2/cache/index2/type=Unified
+cpu/cpu2/topology/core_cpus_list=2
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=1024K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/cache/index2/level=3
+cpu/cpu3/cache/index2/shared_cpu_list=0-3
+cpu/cpu3/cache/index2/size=8192K
+cpu/cpu3/cache/index2/type=Unified
+cpu/cpu3/topology/core_cpus_list=3
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/shared_cpu_list=4
+cpu/cpu4/cache/index0/size=32K
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index1/level=2
+cpu/cpu4/cache/index1/shared_cpu_list=4
+cpu/cpu4/cache/index1/size=1024K
+cpu/cpu4/cache/index1/type=Unified
+cpu/cpu4/cache/index2/level=3
+cpu/cpu4/cache/index2/shared_cpu_list=4-7
+cpu/cpu4/cache/index2/size=8192K
+cpu/cpu4/cache/index2/type=Unified
+cpu/cpu4/topology/core_cpus_list=4
+cpu/cpu4/topology/core_id=0
+cpu/cpu4/topology/physical_package_id=1
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/shared_cpu_list=5
+cpu/cpu5/cache/index0/size=32K
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index1/level=2
+cpu/cpu5/cache/index1/shared_cpu_list=5
+cpu/cpu5/cache/index1/size=1024K
+cpu/cpu5/cache/index1/type=Unified
+cpu/cpu5/cache/index2/level=3
+cpu/cpu5/cache/index2/shared_cpu_list=4-7
+cpu/cpu5/cache/index2/size=8192K
+cpu/cpu5/cache/index2/type=Unified
+cpu/cpu5/topology/core_cpus_list=5
+cpu/cpu5/topology/core_id=1
+cpu/cpu5/topology/physical_package_id=1
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/shared_cpu_list=6
+cpu/cpu6/cache/index0/size=32K
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index1/level=2
+cpu/cpu6/cache/index1/shared_cpu_list=6
+cpu/cpu6/cache/index1/size=1024K
+cpu/cpu6/cache/index1/type=Unified
+cpu/cpu6/cache/index2/level=3
+cpu/cpu6/cache/index2/shared_cpu_list=4-7
+cpu/cpu6/cache/index2/size=8192K
+cpu/cpu6/cache/index2/type=Unified
+cpu/cpu6/topology/core_cpus_list=6
+cpu/cpu6/topology/core_id=2
+cpu/cpu6/topology/physical_package_id=1
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/shared_cpu_list=7
+cpu/cpu7/cache/index0/size=32K
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index1/level=2
+cpu/cpu7/cache/index1/shared_cpu_list=7
+cpu/cpu7/cache/index1/size=1024K
+cpu/cpu7/cache/index1/type=Unified
+cpu/cpu7/cache/index2/level=3
+cpu/cpu7/cache/index2/shared_cpu_list=4-7
+cpu/cpu7/cache/index2/size=8192K
+cpu/cpu7/cache/index2/type=Unified
+cpu/cpu7/topology/core_cpus_list=7
+cpu/cpu7/topology/core_id=3
+cpu/cpu7/topology/physical_package_id=1
+cpu/present=0-7
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_dual_socket_no_siblings.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_dual_socket_no_siblings.sysfs.txt
new file mode 100644
index 0000000..2314ba8
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_dual_socket_no_siblings.sysfs.txt
@@ -0,0 +1,117 @@
+# SYNTHETIC machine (not a hardware capture): identical to
+# synthetic_dual_socket.sysfs.txt except topology/core_cpus_list is absent
+# (pre-5.3 kernel shape), forcing physical-core identity through the
+# (physical_package_id, core_id) fallback key.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=1024K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/cache/index2/level=3
+cpu/cpu0/cache/index2/shared_cpu_list=0-3
+cpu/cpu0/cache/index2/size=8192K
+cpu/cpu0/cache/index2/type=Unified
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=1024K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/cache/index2/level=3
+cpu/cpu1/cache/index2/shared_cpu_list=0-3
+cpu/cpu1/cache/index2/size=8192K
+cpu/cpu1/cache/index2/type=Unified
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=1024K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/cache/index2/level=3
+cpu/cpu2/cache/index2/shared_cpu_list=0-3
+cpu/cpu2/cache/index2/size=8192K
+cpu/cpu2/cache/index2/type=Unified
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=1024K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/cache/index2/level=3
+cpu/cpu3/cache/index2/shared_cpu_list=0-3
+cpu/cpu3/cache/index2/size=8192K
+cpu/cpu3/cache/index2/type=Unified
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/shared_cpu_list=4
+cpu/cpu4/cache/index0/size=32K
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index1/level=2
+cpu/cpu4/cache/index1/shared_cpu_list=4
+cpu/cpu4/cache/index1/size=1024K
+cpu/cpu4/cache/index1/type=Unified
+cpu/cpu4/cache/index2/level=3
+cpu/cpu4/cache/index2/shared_cpu_list=4-7
+cpu/cpu4/cache/index2/size=8192K
+cpu/cpu4/cache/index2/type=Unified
+cpu/cpu4/topology/core_id=0
+cpu/cpu4/topology/physical_package_id=1
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/shared_cpu_list=5
+cpu/cpu5/cache/index0/size=32K
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index1/level=2
+cpu/cpu5/cache/index1/shared_cpu_list=5
+cpu/cpu5/cache/index1/size=1024K
+cpu/cpu5/cache/index1/type=Unified
+cpu/cpu5/cache/index2/level=3
+cpu/cpu5/cache/index2/shared_cpu_list=4-7
+cpu/cpu5/cache/index2/size=8192K
+cpu/cpu5/cache/index2/type=Unified
+cpu/cpu5/topology/core_id=1
+cpu/cpu5/topology/physical_package_id=1
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/shared_cpu_list=6
+cpu/cpu6/cache/index0/size=32K
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index1/level=2
+cpu/cpu6/cache/index1/shared_cpu_list=6
+cpu/cpu6/cache/index1/size=1024K
+cpu/cpu6/cache/index1/type=Unified
+cpu/cpu6/cache/index2/level=3
+cpu/cpu6/cache/index2/shared_cpu_list=4-7
+cpu/cpu6/cache/index2/size=8192K
+cpu/cpu6/cache/index2/type=Unified
+cpu/cpu6/topology/core_id=2
+cpu/cpu6/topology/physical_package_id=1
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/shared_cpu_list=7
+cpu/cpu7/cache/index0/size=32K
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index1/level=2
+cpu/cpu7/cache/index1/shared_cpu_list=7
+cpu/cpu7/cache/index1/size=1024K
+cpu/cpu7/cache/index1/type=Unified
+cpu/cpu7/cache/index2/level=3
+cpu/cpu7/cache/index2/shared_cpu_list=4-7
+cpu/cpu7/cache/index2/size=8192K
+cpu/cpu7/cache/index2/type=Unified
+cpu/cpu7/topology/core_id=3
+cpu/cpu7/topology/physical_package_id=1
+cpu/present=0-7
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_fragmented_cpulist.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_fragmented_cpulist.sysfs.txt
new file mode 100644
index 0000000..0bf7c94
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_fragmented_cpulist.sysfs.txt
@@ -0,0 +1,212 @@
+# SYNTHETIC machine (not a hardware capture): 200 CPUs on one NUMA node whose
+# node0/cpulist enumerates every cpu INDIVIDUALLY ("0,1,2,...") as seen on
+# some POWER/AMD/SNC systems -- a ~690-character line that overflows small
+# read buffers. If the reader's buffer is too small the node lookup fails
+# closed and silently degrades to the package fallback, detectable here
+# because physical_package_id (7) differs from the node id (0).
+# Trimmed to the files the node-table queries read (present, node/*, and
+# per-cpu physical_package_id); this fixture never constructs topologies,
+# so core_id and cache files are omitted.
+cpu/cpu0/topology/physical_package_id=7
+cpu/cpu1/topology/physical_package_id=7
+cpu/cpu2/topology/physical_package_id=7
+cpu/cpu3/topology/physical_package_id=7
+cpu/cpu4/topology/physical_package_id=7
+cpu/cpu5/topology/physical_package_id=7
+cpu/cpu6/topology/physical_package_id=7
+cpu/cpu7/topology/physical_package_id=7
+cpu/cpu8/topology/physical_package_id=7
+cpu/cpu9/topology/physical_package_id=7
+cpu/cpu10/topology/physical_package_id=7
+cpu/cpu11/topology/physical_package_id=7
+cpu/cpu12/topology/physical_package_id=7
+cpu/cpu13/topology/physical_package_id=7
+cpu/cpu14/topology/physical_package_id=7
+cpu/cpu15/topology/physical_package_id=7
+cpu/cpu16/topology/physical_package_id=7
+cpu/cpu17/topology/physical_package_id=7
+cpu/cpu18/topology/physical_package_id=7
+cpu/cpu19/topology/physical_package_id=7
+cpu/cpu20/topology/physical_package_id=7
+cpu/cpu21/topology/physical_package_id=7
+cpu/cpu22/topology/physical_package_id=7
+cpu/cpu23/topology/physical_package_id=7
+cpu/cpu24/topology/physical_package_id=7
+cpu/cpu25/topology/physical_package_id=7
+cpu/cpu26/topology/physical_package_id=7
+cpu/cpu27/topology/physical_package_id=7
+cpu/cpu28/topology/physical_package_id=7
+cpu/cpu29/topology/physical_package_id=7
+cpu/cpu30/topology/physical_package_id=7
+cpu/cpu31/topology/physical_package_id=7
+cpu/cpu32/topology/physical_package_id=7
+cpu/cpu33/topology/physical_package_id=7
+cpu/cpu34/topology/physical_package_id=7
+cpu/cpu35/topology/physical_package_id=7
+cpu/cpu36/topology/physical_package_id=7
+cpu/cpu37/topology/physical_package_id=7
+cpu/cpu38/topology/physical_package_id=7
+cpu/cpu39/topology/physical_package_id=7
+cpu/cpu40/topology/physical_package_id=7
+cpu/cpu41/topology/physical_package_id=7
+cpu/cpu42/topology/physical_package_id=7
+cpu/cpu43/topology/physical_package_id=7
+cpu/cpu44/topology/physical_package_id=7
+cpu/cpu45/topology/physical_package_id=7
+cpu/cpu46/topology/physical_package_id=7
+cpu/cpu47/topology/physical_package_id=7
+cpu/cpu48/topology/physical_package_id=7
+cpu/cpu49/topology/physical_package_id=7
+cpu/cpu50/topology/physical_package_id=7
+cpu/cpu51/topology/physical_package_id=7
+cpu/cpu52/topology/physical_package_id=7
+cpu/cpu53/topology/physical_package_id=7
+cpu/cpu54/topology/physical_package_id=7
+cpu/cpu55/topology/physical_package_id=7
+cpu/cpu56/topology/physical_package_id=7
+cpu/cpu57/topology/physical_package_id=7
+cpu/cpu58/topology/physical_package_id=7
+cpu/cpu59/topology/physical_package_id=7
+cpu/cpu60/topology/physical_package_id=7
+cpu/cpu61/topology/physical_package_id=7
+cpu/cpu62/topology/physical_package_id=7
+cpu/cpu63/topology/physical_package_id=7
+cpu/cpu64/topology/physical_package_id=7
+cpu/cpu65/topology/physical_package_id=7
+cpu/cpu66/topology/physical_package_id=7
+cpu/cpu67/topology/physical_package_id=7
+cpu/cpu68/topology/physical_package_id=7
+cpu/cpu69/topology/physical_package_id=7
+cpu/cpu70/topology/physical_package_id=7
+cpu/cpu71/topology/physical_package_id=7
+cpu/cpu72/topology/physical_package_id=7
+cpu/cpu73/topology/physical_package_id=7
+cpu/cpu74/topology/physical_package_id=7
+cpu/cpu75/topology/physical_package_id=7
+cpu/cpu76/topology/physical_package_id=7
+cpu/cpu77/topology/physical_package_id=7
+cpu/cpu78/topology/physical_package_id=7
+cpu/cpu79/topology/physical_package_id=7
+cpu/cpu80/topology/physical_package_id=7
+cpu/cpu81/topology/physical_package_id=7
+cpu/cpu82/topology/physical_package_id=7
+cpu/cpu83/topology/physical_package_id=7
+cpu/cpu84/topology/physical_package_id=7
+cpu/cpu85/topology/physical_package_id=7
+cpu/cpu86/topology/physical_package_id=7
+cpu/cpu87/topology/physical_package_id=7
+cpu/cpu88/topology/physical_package_id=7
+cpu/cpu89/topology/physical_package_id=7
+cpu/cpu90/topology/physical_package_id=7
+cpu/cpu91/topology/physical_package_id=7
+cpu/cpu92/topology/physical_package_id=7
+cpu/cpu93/topology/physical_package_id=7
+cpu/cpu94/topology/physical_package_id=7
+cpu/cpu95/topology/physical_package_id=7
+cpu/cpu96/topology/physical_package_id=7
+cpu/cpu97/topology/physical_package_id=7
+cpu/cpu98/topology/physical_package_id=7
+cpu/cpu99/topology/physical_package_id=7
+cpu/cpu100/topology/physical_package_id=7
+cpu/cpu101/topology/physical_package_id=7
+cpu/cpu102/topology/physical_package_id=7
+cpu/cpu103/topology/physical_package_id=7
+cpu/cpu104/topology/physical_package_id=7
+cpu/cpu105/topology/physical_package_id=7
+cpu/cpu106/topology/physical_package_id=7
+cpu/cpu107/topology/physical_package_id=7
+cpu/cpu108/topology/physical_package_id=7
+cpu/cpu109/topology/physical_package_id=7
+cpu/cpu110/topology/physical_package_id=7
+cpu/cpu111/topology/physical_package_id=7
+cpu/cpu112/topology/physical_package_id=7
+cpu/cpu113/topology/physical_package_id=7
+cpu/cpu114/topology/physical_package_id=7
+cpu/cpu115/topology/physical_package_id=7
+cpu/cpu116/topology/physical_package_id=7
+cpu/cpu117/topology/physical_package_id=7
+cpu/cpu118/topology/physical_package_id=7
+cpu/cpu119/topology/physical_package_id=7
+cpu/cpu120/topology/physical_package_id=7
+cpu/cpu121/topology/physical_package_id=7
+cpu/cpu122/topology/physical_package_id=7
+cpu/cpu123/topology/physical_package_id=7
+cpu/cpu124/topology/physical_package_id=7
+cpu/cpu125/topology/physical_package_id=7
+cpu/cpu126/topology/physical_package_id=7
+cpu/cpu127/topology/physical_package_id=7
+cpu/cpu128/topology/physical_package_id=7
+cpu/cpu129/topology/physical_package_id=7
+cpu/cpu130/topology/physical_package_id=7
+cpu/cpu131/topology/physical_package_id=7
+cpu/cpu132/topology/physical_package_id=7
+cpu/cpu133/topology/physical_package_id=7
+cpu/cpu134/topology/physical_package_id=7
+cpu/cpu135/topology/physical_package_id=7
+cpu/cpu136/topology/physical_package_id=7
+cpu/cpu137/topology/physical_package_id=7
+cpu/cpu138/topology/physical_package_id=7
+cpu/cpu139/topology/physical_package_id=7
+cpu/cpu140/topology/physical_package_id=7
+cpu/cpu141/topology/physical_package_id=7
+cpu/cpu142/topology/physical_package_id=7
+cpu/cpu143/topology/physical_package_id=7
+cpu/cpu144/topology/physical_package_id=7
+cpu/cpu145/topology/physical_package_id=7
+cpu/cpu146/topology/physical_package_id=7
+cpu/cpu147/topology/physical_package_id=7
+cpu/cpu148/topology/physical_package_id=7
+cpu/cpu149/topology/physical_package_id=7
+cpu/cpu150/topology/physical_package_id=7
+cpu/cpu151/topology/physical_package_id=7
+cpu/cpu152/topology/physical_package_id=7
+cpu/cpu153/topology/physical_package_id=7
+cpu/cpu154/topology/physical_package_id=7
+cpu/cpu155/topology/physical_package_id=7
+cpu/cpu156/topology/physical_package_id=7
+cpu/cpu157/topology/physical_package_id=7
+cpu/cpu158/topology/physical_package_id=7
+cpu/cpu159/topology/physical_package_id=7
+cpu/cpu160/topology/physical_package_id=7
+cpu/cpu161/topology/physical_package_id=7
+cpu/cpu162/topology/physical_package_id=7
+cpu/cpu163/topology/physical_package_id=7
+cpu/cpu164/topology/physical_package_id=7
+cpu/cpu165/topology/physical_package_id=7
+cpu/cpu166/topology/physical_package_id=7
+cpu/cpu167/topology/physical_package_id=7
+cpu/cpu168/topology/physical_package_id=7
+cpu/cpu169/topology/physical_package_id=7
+cpu/cpu170/topology/physical_package_id=7
+cpu/cpu171/topology/physical_package_id=7
+cpu/cpu172/topology/physical_package_id=7
+cpu/cpu173/topology/physical_package_id=7
+cpu/cpu174/topology/physical_package_id=7
+cpu/cpu175/topology/physical_package_id=7
+cpu/cpu176/topology/physical_package_id=7
+cpu/cpu177/topology/physical_package_id=7
+cpu/cpu178/topology/physical_package_id=7
+cpu/cpu179/topology/physical_package_id=7
+cpu/cpu180/topology/physical_package_id=7
+cpu/cpu181/topology/physical_package_id=7
+cpu/cpu182/topology/physical_package_id=7
+cpu/cpu183/topology/physical_package_id=7
+cpu/cpu184/topology/physical_package_id=7
+cpu/cpu185/topology/physical_package_id=7
+cpu/cpu186/topology/physical_package_id=7
+cpu/cpu187/topology/physical_package_id=7
+cpu/cpu188/topology/physical_package_id=7
+cpu/cpu189/topology/physical_package_id=7
+cpu/cpu190/topology/physical_package_id=7
+cpu/cpu191/topology/physical_package_id=7
+cpu/cpu192/topology/physical_package_id=7
+cpu/cpu193/topology/physical_package_id=7
+cpu/cpu194/topology/physical_package_id=7
+cpu/cpu195/topology/physical_package_id=7
+cpu/cpu196/topology/physical_package_id=7
+cpu/cpu197/topology/physical_package_id=7
+cpu/cpu198/topology/physical_package_id=7
+cpu/cpu199/topology/physical_package_id=7
+cpu/present=0-199
+node/node0/cpulist=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199
+node/online=0
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_invalid_package.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_invalid_package.sysfs.txt
new file mode 100644
index 0000000..cb53e84
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_invalid_package.sysfs.txt
@@ -0,0 +1,46 @@
+# SYNTHETIC machine (not a hardware capture): 4 cores whose
+# physical_package_id is the kernel's -1 "unavailable" sentinel read as
+# unsigned (65535), and no node hierarchy. The machine must collapse to a
+# single node and the 8-bit affinity group hint must stay 0 -- never the
+# truncated 255 (65535 & 0xFF) handed to set_mempolicy.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=1024K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=65535
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=1024K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=65535
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=1024K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=65535
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=1024K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=65535
+cpu/present=0-3
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_memory_only_node.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_memory_only_node.sysfs.txt
new file mode 100644
index 0000000..f08d033
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_memory_only_node.sysfs.txt
@@ -0,0 +1,49 @@
+# SYNTHETIC machine (not a hardware capture): 4 cores all on NUMA node 0,
+# plus a memory-only node 1 (listed in node/online with a readable but EMPTY
+# cpulist -- CXL / Optane / some SNC configs). The CPU-less node must never
+# be enumerated as a schedulable node or become an executor with zero worker
+# groups.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=1024K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=1024K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=1024K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=1024K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/present=0-3
+node/node0/cpulist=0,1,2,3
+node/node1/cpulist=
+node/online=0,1
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_meteor_lake.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_meteor_lake.sysfs.txt
new file mode 100644
index 0000000..0d3339a
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_meteor_lake.sysfs.txt
@@ -0,0 +1,331 @@
+# SYNTHETIC machine (not a hardware capture): Intel Core Ultra 7 165H-like
+# hybrid client CPU. 6 P-cores (HT pairs, 48K L1d / 2M L2 each), 8 E-cores in
+# two 4-core L2 modules (4M L2 per module), 2 LP-E cores on the SoC tile with
+# NO L3; 24M L3 shared across P+E (cpus 0-19). Single package, no
+# /sys/devices/system/node hierarchy.
+# Cluster ids are deliberately SPARSE ({0, 8, 10..15, 16}) as a real 165H
+# reports them: under the old "cluster_id == node" scheme ids >= the unique
+# cluster count were never enumerated and those cores silently vanished.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0-1
+cpu/cpu0/cache/index0/size=48K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0-1
+cpu/cpu0/cache/index1/size=2048K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/cache/index2/level=3
+cpu/cpu0/cache/index2/shared_cpu_list=0-19
+cpu/cpu0/cache/index2/size=24576K
+cpu/cpu0/cache/index2/type=Unified
+cpu/cpu0/topology/cluster_id=10
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=0-1
+cpu/cpu1/cache/index0/size=48K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=0-1
+cpu/cpu1/cache/index1/size=2048K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/cache/index2/level=3
+cpu/cpu1/cache/index2/shared_cpu_list=0-19
+cpu/cpu1/cache/index2/size=24576K
+cpu/cpu1/cache/index2/type=Unified
+cpu/cpu1/topology/cluster_id=10
+cpu/cpu1/topology/core_id=0
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2-3
+cpu/cpu2/cache/index0/size=48K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2-3
+cpu/cpu2/cache/index1/size=2048K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/cache/index2/level=3
+cpu/cpu2/cache/index2/shared_cpu_list=0-19
+cpu/cpu2/cache/index2/size=24576K
+cpu/cpu2/cache/index2/type=Unified
+cpu/cpu2/topology/cluster_id=11
+cpu/cpu2/topology/core_id=1
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=2-3
+cpu/cpu3/cache/index0/size=48K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=2-3
+cpu/cpu3/cache/index1/size=2048K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/cache/index2/level=3
+cpu/cpu3/cache/index2/shared_cpu_list=0-19
+cpu/cpu3/cache/index2/size=24576K
+cpu/cpu3/cache/index2/type=Unified
+cpu/cpu3/topology/cluster_id=11
+cpu/cpu3/topology/core_id=1
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/shared_cpu_list=4-5
+cpu/cpu4/cache/index0/size=48K
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index1/level=2
+cpu/cpu4/cache/index1/shared_cpu_list=4-5
+cpu/cpu4/cache/index1/size=2048K
+cpu/cpu4/cache/index1/type=Unified
+cpu/cpu4/cache/index2/level=3
+cpu/cpu4/cache/index2/shared_cpu_list=0-19
+cpu/cpu4/cache/index2/size=24576K
+cpu/cpu4/cache/index2/type=Unified
+cpu/cpu4/topology/cluster_id=12
+cpu/cpu4/topology/core_id=2
+cpu/cpu4/topology/physical_package_id=0
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/shared_cpu_list=4-5
+cpu/cpu5/cache/index0/size=48K
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index1/level=2
+cpu/cpu5/cache/index1/shared_cpu_list=4-5
+cpu/cpu5/cache/index1/size=2048K
+cpu/cpu5/cache/index1/type=Unified
+cpu/cpu5/cache/index2/level=3
+cpu/cpu5/cache/index2/shared_cpu_list=0-19
+cpu/cpu5/cache/index2/size=24576K
+cpu/cpu5/cache/index2/type=Unified
+cpu/cpu5/topology/cluster_id=12
+cpu/cpu5/topology/core_id=2
+cpu/cpu5/topology/physical_package_id=0
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/shared_cpu_list=6-7
+cpu/cpu6/cache/index0/size=48K
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index1/level=2
+cpu/cpu6/cache/index1/shared_cpu_list=6-7
+cpu/cpu6/cache/index1/size=2048K
+cpu/cpu6/cache/index1/type=Unified
+cpu/cpu6/cache/index2/level=3
+cpu/cpu6/cache/index2/shared_cpu_list=0-19
+cpu/cpu6/cache/index2/size=24576K
+cpu/cpu6/cache/index2/type=Unified
+cpu/cpu6/topology/cluster_id=13
+cpu/cpu6/topology/core_id=3
+cpu/cpu6/topology/physical_package_id=0
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/shared_cpu_list=6-7
+cpu/cpu7/cache/index0/size=48K
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index1/level=2
+cpu/cpu7/cache/index1/shared_cpu_list=6-7
+cpu/cpu7/cache/index1/size=2048K
+cpu/cpu7/cache/index1/type=Unified
+cpu/cpu7/cache/index2/level=3
+cpu/cpu7/cache/index2/shared_cpu_list=0-19
+cpu/cpu7/cache/index2/size=24576K
+cpu/cpu7/cache/index2/type=Unified
+cpu/cpu7/topology/cluster_id=13
+cpu/cpu7/topology/core_id=3
+cpu/cpu7/topology/physical_package_id=0
+cpu/cpu8/cache/index0/level=1
+cpu/cpu8/cache/index0/shared_cpu_list=8-9
+cpu/cpu8/cache/index0/size=48K
+cpu/cpu8/cache/index0/type=Data
+cpu/cpu8/cache/index1/level=2
+cpu/cpu8/cache/index1/shared_cpu_list=8-9
+cpu/cpu8/cache/index1/size=2048K
+cpu/cpu8/cache/index1/type=Unified
+cpu/cpu8/cache/index2/level=3
+cpu/cpu8/cache/index2/shared_cpu_list=0-19
+cpu/cpu8/cache/index2/size=24576K
+cpu/cpu8/cache/index2/type=Unified
+cpu/cpu8/topology/cluster_id=14
+cpu/cpu8/topology/core_id=4
+cpu/cpu8/topology/physical_package_id=0
+cpu/cpu9/cache/index0/level=1
+cpu/cpu9/cache/index0/shared_cpu_list=8-9
+cpu/cpu9/cache/index0/size=48K
+cpu/cpu9/cache/index0/type=Data
+cpu/cpu9/cache/index1/level=2
+cpu/cpu9/cache/index1/shared_cpu_list=8-9
+cpu/cpu9/cache/index1/size=2048K
+cpu/cpu9/cache/index1/type=Unified
+cpu/cpu9/cache/index2/level=3
+cpu/cpu9/cache/index2/shared_cpu_list=0-19
+cpu/cpu9/cache/index2/size=24576K
+cpu/cpu9/cache/index2/type=Unified
+cpu/cpu9/topology/cluster_id=14
+cpu/cpu9/topology/core_id=4
+cpu/cpu9/topology/physical_package_id=0
+cpu/cpu10/cache/index0/level=1
+cpu/cpu10/cache/index0/shared_cpu_list=10-11
+cpu/cpu10/cache/index0/size=48K
+cpu/cpu10/cache/index0/type=Data
+cpu/cpu10/cache/index1/level=2
+cpu/cpu10/cache/index1/shared_cpu_list=10-11
+cpu/cpu10/cache/index1/size=2048K
+cpu/cpu10/cache/index1/type=Unified
+cpu/cpu10/cache/index2/level=3
+cpu/cpu10/cache/index2/shared_cpu_list=0-19
+cpu/cpu10/cache/index2/size=24576K
+cpu/cpu10/cache/index2/type=Unified
+cpu/cpu10/topology/cluster_id=15
+cpu/cpu10/topology/core_id=5
+cpu/cpu10/topology/physical_package_id=0
+cpu/cpu11/cache/index0/level=1
+cpu/cpu11/cache/index0/shared_cpu_list=10-11
+cpu/cpu11/cache/index0/size=48K
+cpu/cpu11/cache/index0/type=Data
+cpu/cpu11/cache/index1/level=2
+cpu/cpu11/cache/index1/shared_cpu_list=10-11
+cpu/cpu11/cache/index1/size=2048K
+cpu/cpu11/cache/index1/type=Unified
+cpu/cpu11/cache/index2/level=3
+cpu/cpu11/cache/index2/shared_cpu_list=0-19
+cpu/cpu11/cache/index2/size=24576K
+cpu/cpu11/cache/index2/type=Unified
+cpu/cpu11/topology/cluster_id=15
+cpu/cpu11/topology/core_id=5
+cpu/cpu11/topology/physical_package_id=0
+cpu/cpu12/cache/index0/level=1
+cpu/cpu12/cache/index0/shared_cpu_list=12
+cpu/cpu12/cache/index0/size=32K
+cpu/cpu12/cache/index0/type=Data
+cpu/cpu12/cache/index1/level=2
+cpu/cpu12/cache/index1/shared_cpu_list=12-15
+cpu/cpu12/cache/index1/size=4096K
+cpu/cpu12/cache/index1/type=Unified
+cpu/cpu12/cache/index2/level=3
+cpu/cpu12/cache/index2/shared_cpu_list=0-19
+cpu/cpu12/cache/index2/size=24576K
+cpu/cpu12/cache/index2/type=Unified
+cpu/cpu12/topology/cluster_id=0
+cpu/cpu12/topology/core_id=6
+cpu/cpu12/topology/physical_package_id=0
+cpu/cpu13/cache/index0/level=1
+cpu/cpu13/cache/index0/shared_cpu_list=13
+cpu/cpu13/cache/index0/size=32K
+cpu/cpu13/cache/index0/type=Data
+cpu/cpu13/cache/index1/level=2
+cpu/cpu13/cache/index1/shared_cpu_list=12-15
+cpu/cpu13/cache/index1/size=4096K
+cpu/cpu13/cache/index1/type=Unified
+cpu/cpu13/cache/index2/level=3
+cpu/cpu13/cache/index2/shared_cpu_list=0-19
+cpu/cpu13/cache/index2/size=24576K
+cpu/cpu13/cache/index2/type=Unified
+cpu/cpu13/topology/cluster_id=0
+cpu/cpu13/topology/core_id=7
+cpu/cpu13/topology/physical_package_id=0
+cpu/cpu14/cache/index0/level=1
+cpu/cpu14/cache/index0/shared_cpu_list=14
+cpu/cpu14/cache/index0/size=32K
+cpu/cpu14/cache/index0/type=Data
+cpu/cpu14/cache/index1/level=2
+cpu/cpu14/cache/index1/shared_cpu_list=12-15
+cpu/cpu14/cache/index1/size=4096K
+cpu/cpu14/cache/index1/type=Unified
+cpu/cpu14/cache/index2/level=3
+cpu/cpu14/cache/index2/shared_cpu_list=0-19
+cpu/cpu14/cache/index2/size=24576K
+cpu/cpu14/cache/index2/type=Unified
+cpu/cpu14/topology/cluster_id=0
+cpu/cpu14/topology/core_id=8
+cpu/cpu14/topology/physical_package_id=0
+cpu/cpu15/cache/index0/level=1
+cpu/cpu15/cache/index0/shared_cpu_list=15
+cpu/cpu15/cache/index0/size=32K
+cpu/cpu15/cache/index0/type=Data
+cpu/cpu15/cache/index1/level=2
+cpu/cpu15/cache/index1/shared_cpu_list=12-15
+cpu/cpu15/cache/index1/size=4096K
+cpu/cpu15/cache/index1/type=Unified
+cpu/cpu15/cache/index2/level=3
+cpu/cpu15/cache/index2/shared_cpu_list=0-19
+cpu/cpu15/cache/index2/size=24576K
+cpu/cpu15/cache/index2/type=Unified
+cpu/cpu15/topology/cluster_id=0
+cpu/cpu15/topology/core_id=9
+cpu/cpu15/topology/physical_package_id=0
+cpu/cpu16/cache/index0/level=1
+cpu/cpu16/cache/index0/shared_cpu_list=16
+cpu/cpu16/cache/index0/size=32K
+cpu/cpu16/cache/index0/type=Data
+cpu/cpu16/cache/index1/level=2
+cpu/cpu16/cache/index1/shared_cpu_list=16-19
+cpu/cpu16/cache/index1/size=4096K
+cpu/cpu16/cache/index1/type=Unified
+cpu/cpu16/cache/index2/level=3
+cpu/cpu16/cache/index2/shared_cpu_list=0-19
+cpu/cpu16/cache/index2/size=24576K
+cpu/cpu16/cache/index2/type=Unified
+cpu/cpu16/topology/cluster_id=8
+cpu/cpu16/topology/core_id=10
+cpu/cpu16/topology/physical_package_id=0
+cpu/cpu17/cache/index0/level=1
+cpu/cpu17/cache/index0/shared_cpu_list=17
+cpu/cpu17/cache/index0/size=32K
+cpu/cpu17/cache/index0/type=Data
+cpu/cpu17/cache/index1/level=2
+cpu/cpu17/cache/index1/shared_cpu_list=16-19
+cpu/cpu17/cache/index1/size=4096K
+cpu/cpu17/cache/index1/type=Unified
+cpu/cpu17/cache/index2/level=3
+cpu/cpu17/cache/index2/shared_cpu_list=0-19
+cpu/cpu17/cache/index2/size=24576K
+cpu/cpu17/cache/index2/type=Unified
+cpu/cpu17/topology/cluster_id=8
+cpu/cpu17/topology/core_id=11
+cpu/cpu17/topology/physical_package_id=0
+cpu/cpu18/cache/index0/level=1
+cpu/cpu18/cache/index0/shared_cpu_list=18
+cpu/cpu18/cache/index0/size=32K
+cpu/cpu18/cache/index0/type=Data
+cpu/cpu18/cache/index1/level=2
+cpu/cpu18/cache/index1/shared_cpu_list=16-19
+cpu/cpu18/cache/index1/size=4096K
+cpu/cpu18/cache/index1/type=Unified
+cpu/cpu18/cache/index2/level=3
+cpu/cpu18/cache/index2/shared_cpu_list=0-19
+cpu/cpu18/cache/index2/size=24576K
+cpu/cpu18/cache/index2/type=Unified
+cpu/cpu18/topology/cluster_id=8
+cpu/cpu18/topology/core_id=12
+cpu/cpu18/topology/physical_package_id=0
+cpu/cpu19/cache/index0/level=1
+cpu/cpu19/cache/index0/shared_cpu_list=19
+cpu/cpu19/cache/index0/size=32K
+cpu/cpu19/cache/index0/type=Data
+cpu/cpu19/cache/index1/level=2
+cpu/cpu19/cache/index1/shared_cpu_list=16-19
+cpu/cpu19/cache/index1/size=4096K
+cpu/cpu19/cache/index1/type=Unified
+cpu/cpu19/cache/index2/level=3
+cpu/cpu19/cache/index2/shared_cpu_list=0-19
+cpu/cpu19/cache/index2/size=24576K
+cpu/cpu19/cache/index2/type=Unified
+cpu/cpu19/topology/cluster_id=8
+cpu/cpu19/topology/core_id=13
+cpu/cpu19/topology/physical_package_id=0
+cpu/cpu20/cache/index0/level=1
+cpu/cpu20/cache/index0/shared_cpu_list=20
+cpu/cpu20/cache/index0/size=32K
+cpu/cpu20/cache/index0/type=Data
+cpu/cpu20/cache/index1/level=2
+cpu/cpu20/cache/index1/shared_cpu_list=20-21
+cpu/cpu20/cache/index1/size=2048K
+cpu/cpu20/cache/index1/type=Unified
+cpu/cpu20/topology/cluster_id=16
+cpu/cpu20/topology/core_id=14
+cpu/cpu20/topology/physical_package_id=0
+cpu/cpu21/cache/index0/level=1
+cpu/cpu21/cache/index0/shared_cpu_list=21
+cpu/cpu21/cache/index0/size=32K
+cpu/cpu21/cache/index0/type=Data
+cpu/cpu21/cache/index1/level=2
+cpu/cpu21/cache/index1/shared_cpu_list=20-21
+cpu/cpu21/cache/index1/size=2048K
+cpu/cpu21/cache/index1/type=Unified
+cpu/cpu21/topology/cluster_id=16
+cpu/cpu21/topology/core_id=15
+cpu/cpu21/topology/physical_package_id=0
+cpu/present=0-21
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_raptor_lake.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_raptor_lake.sysfs.txt
new file mode 100644
index 0000000..f4ea755
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_raptor_lake.sysfs.txt
@@ -0,0 +1,398 @@
+# SYNTHETIC machine (not a hardware capture): Intel Core i7-13700 (Raptor
+# Lake desktop) as reported in https://github.com/iree-org/iree/issues/24761,
+# the ticket behind the node!=cluster_id rework. 8 HT P-cores (48K L1d + 2M L2
+# per core, one cluster per core) + 8 E-cores in two 4-core modules (32K L1d,
+# 4M L2 per module) = 24 logical CPUs, 16 physical cores, 30M L3 shared by
+# all, one package, one NUMA node exposed via /sys/devices/system/node.
+# Cluster ids are the ticket's sparse set {0,8,16,24,32,40,48,56,64,72} with
+# cpu18/cpu19 sharing 64. Under the old cluster_id-as-node scheme the default
+# --task_topology_nodes=current pinned all work onto ONE cluster (the
+# ticket's 422ms wall == cpu time, single worker); node identity must instead
+# yield one node covering all 16 cores.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0-1
+cpu/cpu0/cache/index0/size=48K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0-1
+cpu/cpu0/cache/index1/size=2048K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/cache/index2/level=3
+cpu/cpu0/cache/index2/shared_cpu_list=0-23
+cpu/cpu0/cache/index2/size=30720K
+cpu/cpu0/cache/index2/type=Unified
+cpu/cpu0/topology/cluster_id=0
+cpu/cpu0/topology/core_cpus_list=0-1
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=0-1
+cpu/cpu1/cache/index0/size=48K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=0-1
+cpu/cpu1/cache/index1/size=2048K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/cache/index2/level=3
+cpu/cpu1/cache/index2/shared_cpu_list=0-23
+cpu/cpu1/cache/index2/size=30720K
+cpu/cpu1/cache/index2/type=Unified
+cpu/cpu1/topology/cluster_id=0
+cpu/cpu1/topology/core_cpus_list=0-1
+cpu/cpu1/topology/core_id=0
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2-3
+cpu/cpu2/cache/index0/size=48K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2-3
+cpu/cpu2/cache/index1/size=2048K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/cache/index2/level=3
+cpu/cpu2/cache/index2/shared_cpu_list=0-23
+cpu/cpu2/cache/index2/size=30720K
+cpu/cpu2/cache/index2/type=Unified
+cpu/cpu2/topology/cluster_id=8
+cpu/cpu2/topology/core_cpus_list=2-3
+cpu/cpu2/topology/core_id=4
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=2-3
+cpu/cpu3/cache/index0/size=48K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=2-3
+cpu/cpu3/cache/index1/size=2048K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/cache/index2/level=3
+cpu/cpu3/cache/index2/shared_cpu_list=0-23
+cpu/cpu3/cache/index2/size=30720K
+cpu/cpu3/cache/index2/type=Unified
+cpu/cpu3/topology/cluster_id=8
+cpu/cpu3/topology/core_cpus_list=2-3
+cpu/cpu3/topology/core_id=4
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/shared_cpu_list=4-5
+cpu/cpu4/cache/index0/size=48K
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index1/level=2
+cpu/cpu4/cache/index1/shared_cpu_list=4-5
+cpu/cpu4/cache/index1/size=2048K
+cpu/cpu4/cache/index1/type=Unified
+cpu/cpu4/cache/index2/level=3
+cpu/cpu4/cache/index2/shared_cpu_list=0-23
+cpu/cpu4/cache/index2/size=30720K
+cpu/cpu4/cache/index2/type=Unified
+cpu/cpu4/topology/cluster_id=16
+cpu/cpu4/topology/core_cpus_list=4-5
+cpu/cpu4/topology/core_id=8
+cpu/cpu4/topology/physical_package_id=0
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/shared_cpu_list=4-5
+cpu/cpu5/cache/index0/size=48K
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index1/level=2
+cpu/cpu5/cache/index1/shared_cpu_list=4-5
+cpu/cpu5/cache/index1/size=2048K
+cpu/cpu5/cache/index1/type=Unified
+cpu/cpu5/cache/index2/level=3
+cpu/cpu5/cache/index2/shared_cpu_list=0-23
+cpu/cpu5/cache/index2/size=30720K
+cpu/cpu5/cache/index2/type=Unified
+cpu/cpu5/topology/cluster_id=16
+cpu/cpu5/topology/core_cpus_list=4-5
+cpu/cpu5/topology/core_id=8
+cpu/cpu5/topology/physical_package_id=0
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/shared_cpu_list=6-7
+cpu/cpu6/cache/index0/size=48K
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index1/level=2
+cpu/cpu6/cache/index1/shared_cpu_list=6-7
+cpu/cpu6/cache/index1/size=2048K
+cpu/cpu6/cache/index1/type=Unified
+cpu/cpu6/cache/index2/level=3
+cpu/cpu6/cache/index2/shared_cpu_list=0-23
+cpu/cpu6/cache/index2/size=30720K
+cpu/cpu6/cache/index2/type=Unified
+cpu/cpu6/topology/cluster_id=24
+cpu/cpu6/topology/core_cpus_list=6-7
+cpu/cpu6/topology/core_id=12
+cpu/cpu6/topology/physical_package_id=0
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/shared_cpu_list=6-7
+cpu/cpu7/cache/index0/size=48K
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index1/level=2
+cpu/cpu7/cache/index1/shared_cpu_list=6-7
+cpu/cpu7/cache/index1/size=2048K
+cpu/cpu7/cache/index1/type=Unified
+cpu/cpu7/cache/index2/level=3
+cpu/cpu7/cache/index2/shared_cpu_list=0-23
+cpu/cpu7/cache/index2/size=30720K
+cpu/cpu7/cache/index2/type=Unified
+cpu/cpu7/topology/cluster_id=24
+cpu/cpu7/topology/core_cpus_list=6-7
+cpu/cpu7/topology/core_id=12
+cpu/cpu7/topology/physical_package_id=0
+cpu/cpu8/cache/index0/level=1
+cpu/cpu8/cache/index0/shared_cpu_list=8-9
+cpu/cpu8/cache/index0/size=48K
+cpu/cpu8/cache/index0/type=Data
+cpu/cpu8/cache/index1/level=2
+cpu/cpu8/cache/index1/shared_cpu_list=8-9
+cpu/cpu8/cache/index1/size=2048K
+cpu/cpu8/cache/index1/type=Unified
+cpu/cpu8/cache/index2/level=3
+cpu/cpu8/cache/index2/shared_cpu_list=0-23
+cpu/cpu8/cache/index2/size=30720K
+cpu/cpu8/cache/index2/type=Unified
+cpu/cpu8/topology/cluster_id=32
+cpu/cpu8/topology/core_cpus_list=8-9
+cpu/cpu8/topology/core_id=16
+cpu/cpu8/topology/physical_package_id=0
+cpu/cpu9/cache/index0/level=1
+cpu/cpu9/cache/index0/shared_cpu_list=8-9
+cpu/cpu9/cache/index0/size=48K
+cpu/cpu9/cache/index0/type=Data
+cpu/cpu9/cache/index1/level=2
+cpu/cpu9/cache/index1/shared_cpu_list=8-9
+cpu/cpu9/cache/index1/size=2048K
+cpu/cpu9/cache/index1/type=Unified
+cpu/cpu9/cache/index2/level=3
+cpu/cpu9/cache/index2/shared_cpu_list=0-23
+cpu/cpu9/cache/index2/size=30720K
+cpu/cpu9/cache/index2/type=Unified
+cpu/cpu9/topology/cluster_id=32
+cpu/cpu9/topology/core_cpus_list=8-9
+cpu/cpu9/topology/core_id=16
+cpu/cpu9/topology/physical_package_id=0
+cpu/cpu10/cache/index0/level=1
+cpu/cpu10/cache/index0/shared_cpu_list=10-11
+cpu/cpu10/cache/index0/size=48K
+cpu/cpu10/cache/index0/type=Data
+cpu/cpu10/cache/index1/level=2
+cpu/cpu10/cache/index1/shared_cpu_list=10-11
+cpu/cpu10/cache/index1/size=2048K
+cpu/cpu10/cache/index1/type=Unified
+cpu/cpu10/cache/index2/level=3
+cpu/cpu10/cache/index2/shared_cpu_list=0-23
+cpu/cpu10/cache/index2/size=30720K
+cpu/cpu10/cache/index2/type=Unified
+cpu/cpu10/topology/cluster_id=40
+cpu/cpu10/topology/core_cpus_list=10-11
+cpu/cpu10/topology/core_id=20
+cpu/cpu10/topology/physical_package_id=0
+cpu/cpu11/cache/index0/level=1
+cpu/cpu11/cache/index0/shared_cpu_list=10-11
+cpu/cpu11/cache/index0/size=48K
+cpu/cpu11/cache/index0/type=Data
+cpu/cpu11/cache/index1/level=2
+cpu/cpu11/cache/index1/shared_cpu_list=10-11
+cpu/cpu11/cache/index1/size=2048K
+cpu/cpu11/cache/index1/type=Unified
+cpu/cpu11/cache/index2/level=3
+cpu/cpu11/cache/index2/shared_cpu_list=0-23
+cpu/cpu11/cache/index2/size=30720K
+cpu/cpu11/cache/index2/type=Unified
+cpu/cpu11/topology/cluster_id=40
+cpu/cpu11/topology/core_cpus_list=10-11
+cpu/cpu11/topology/core_id=20
+cpu/cpu11/topology/physical_package_id=0
+cpu/cpu12/cache/index0/level=1
+cpu/cpu12/cache/index0/shared_cpu_list=12-13
+cpu/cpu12/cache/index0/size=48K
+cpu/cpu12/cache/index0/type=Data
+cpu/cpu12/cache/index1/level=2
+cpu/cpu12/cache/index1/shared_cpu_list=12-13
+cpu/cpu12/cache/index1/size=2048K
+cpu/cpu12/cache/index1/type=Unified
+cpu/cpu12/cache/index2/level=3
+cpu/cpu12/cache/index2/shared_cpu_list=0-23
+cpu/cpu12/cache/index2/size=30720K
+cpu/cpu12/cache/index2/type=Unified
+cpu/cpu12/topology/cluster_id=48
+cpu/cpu12/topology/core_cpus_list=12-13
+cpu/cpu12/topology/core_id=24
+cpu/cpu12/topology/physical_package_id=0
+cpu/cpu13/cache/index0/level=1
+cpu/cpu13/cache/index0/shared_cpu_list=12-13
+cpu/cpu13/cache/index0/size=48K
+cpu/cpu13/cache/index0/type=Data
+cpu/cpu13/cache/index1/level=2
+cpu/cpu13/cache/index1/shared_cpu_list=12-13
+cpu/cpu13/cache/index1/size=2048K
+cpu/cpu13/cache/index1/type=Unified
+cpu/cpu13/cache/index2/level=3
+cpu/cpu13/cache/index2/shared_cpu_list=0-23
+cpu/cpu13/cache/index2/size=30720K
+cpu/cpu13/cache/index2/type=Unified
+cpu/cpu13/topology/cluster_id=48
+cpu/cpu13/topology/core_cpus_list=12-13
+cpu/cpu13/topology/core_id=24
+cpu/cpu13/topology/physical_package_id=0
+cpu/cpu14/cache/index0/level=1
+cpu/cpu14/cache/index0/shared_cpu_list=14-15
+cpu/cpu14/cache/index0/size=48K
+cpu/cpu14/cache/index0/type=Data
+cpu/cpu14/cache/index1/level=2
+cpu/cpu14/cache/index1/shared_cpu_list=14-15
+cpu/cpu14/cache/index1/size=2048K
+cpu/cpu14/cache/index1/type=Unified
+cpu/cpu14/cache/index2/level=3
+cpu/cpu14/cache/index2/shared_cpu_list=0-23
+cpu/cpu14/cache/index2/size=30720K
+cpu/cpu14/cache/index2/type=Unified
+cpu/cpu14/topology/cluster_id=56
+cpu/cpu14/topology/core_cpus_list=14-15
+cpu/cpu14/topology/core_id=28
+cpu/cpu14/topology/physical_package_id=0
+cpu/cpu15/cache/index0/level=1
+cpu/cpu15/cache/index0/shared_cpu_list=14-15
+cpu/cpu15/cache/index0/size=48K
+cpu/cpu15/cache/index0/type=Data
+cpu/cpu15/cache/index1/level=2
+cpu/cpu15/cache/index1/shared_cpu_list=14-15
+cpu/cpu15/cache/index1/size=2048K
+cpu/cpu15/cache/index1/type=Unified
+cpu/cpu15/cache/index2/level=3
+cpu/cpu15/cache/index2/shared_cpu_list=0-23
+cpu/cpu15/cache/index2/size=30720K
+cpu/cpu15/cache/index2/type=Unified
+cpu/cpu15/topology/cluster_id=56
+cpu/cpu15/topology/core_cpus_list=14-15
+cpu/cpu15/topology/core_id=28
+cpu/cpu15/topology/physical_package_id=0
+cpu/cpu16/cache/index0/level=1
+cpu/cpu16/cache/index0/shared_cpu_list=16
+cpu/cpu16/cache/index0/size=32K
+cpu/cpu16/cache/index0/type=Data
+cpu/cpu16/cache/index1/level=2
+cpu/cpu16/cache/index1/shared_cpu_list=16-19
+cpu/cpu16/cache/index1/size=4096K
+cpu/cpu16/cache/index1/type=Unified
+cpu/cpu16/cache/index2/level=3
+cpu/cpu16/cache/index2/shared_cpu_list=0-23
+cpu/cpu16/cache/index2/size=30720K
+cpu/cpu16/cache/index2/type=Unified
+cpu/cpu16/topology/cluster_id=64
+cpu/cpu16/topology/core_cpus_list=16
+cpu/cpu16/topology/core_id=32
+cpu/cpu16/topology/physical_package_id=0
+cpu/cpu17/cache/index0/level=1
+cpu/cpu17/cache/index0/shared_cpu_list=17
+cpu/cpu17/cache/index0/size=32K
+cpu/cpu17/cache/index0/type=Data
+cpu/cpu17/cache/index1/level=2
+cpu/cpu17/cache/index1/shared_cpu_list=16-19
+cpu/cpu17/cache/index1/size=4096K
+cpu/cpu17/cache/index1/type=Unified
+cpu/cpu17/cache/index2/level=3
+cpu/cpu17/cache/index2/shared_cpu_list=0-23
+cpu/cpu17/cache/index2/size=30720K
+cpu/cpu17/cache/index2/type=Unified
+cpu/cpu17/topology/cluster_id=64
+cpu/cpu17/topology/core_cpus_list=17
+cpu/cpu17/topology/core_id=33
+cpu/cpu17/topology/physical_package_id=0
+cpu/cpu18/cache/index0/level=1
+cpu/cpu18/cache/index0/shared_cpu_list=18
+cpu/cpu18/cache/index0/size=32K
+cpu/cpu18/cache/index0/type=Data
+cpu/cpu18/cache/index1/level=2
+cpu/cpu18/cache/index1/shared_cpu_list=16-19
+cpu/cpu18/cache/index1/size=4096K
+cpu/cpu18/cache/index1/type=Unified
+cpu/cpu18/cache/index2/level=3
+cpu/cpu18/cache/index2/shared_cpu_list=0-23
+cpu/cpu18/cache/index2/size=30720K
+cpu/cpu18/cache/index2/type=Unified
+cpu/cpu18/topology/cluster_id=64
+cpu/cpu18/topology/core_cpus_list=18
+cpu/cpu18/topology/core_id=34
+cpu/cpu18/topology/physical_package_id=0
+cpu/cpu19/cache/index0/level=1
+cpu/cpu19/cache/index0/shared_cpu_list=19
+cpu/cpu19/cache/index0/size=32K
+cpu/cpu19/cache/index0/type=Data
+cpu/cpu19/cache/index1/level=2
+cpu/cpu19/cache/index1/shared_cpu_list=16-19
+cpu/cpu19/cache/index1/size=4096K
+cpu/cpu19/cache/index1/type=Unified
+cpu/cpu19/cache/index2/level=3
+cpu/cpu19/cache/index2/shared_cpu_list=0-23
+cpu/cpu19/cache/index2/size=30720K
+cpu/cpu19/cache/index2/type=Unified
+cpu/cpu19/topology/cluster_id=64
+cpu/cpu19/topology/core_cpus_list=19
+cpu/cpu19/topology/core_id=35
+cpu/cpu19/topology/physical_package_id=0
+cpu/cpu20/cache/index0/level=1
+cpu/cpu20/cache/index0/shared_cpu_list=20
+cpu/cpu20/cache/index0/size=32K
+cpu/cpu20/cache/index0/type=Data
+cpu/cpu20/cache/index1/level=2
+cpu/cpu20/cache/index1/shared_cpu_list=20-23
+cpu/cpu20/cache/index1/size=4096K
+cpu/cpu20/cache/index1/type=Unified
+cpu/cpu20/cache/index2/level=3
+cpu/cpu20/cache/index2/shared_cpu_list=0-23
+cpu/cpu20/cache/index2/size=30720K
+cpu/cpu20/cache/index2/type=Unified
+cpu/cpu20/topology/cluster_id=72
+cpu/cpu20/topology/core_cpus_list=20
+cpu/cpu20/topology/core_id=36
+cpu/cpu20/topology/physical_package_id=0
+cpu/cpu21/cache/index0/level=1
+cpu/cpu21/cache/index0/shared_cpu_list=21
+cpu/cpu21/cache/index0/size=32K
+cpu/cpu21/cache/index0/type=Data
+cpu/cpu21/cache/index1/level=2
+cpu/cpu21/cache/index1/shared_cpu_list=20-23
+cpu/cpu21/cache/index1/size=4096K
+cpu/cpu21/cache/index1/type=Unified
+cpu/cpu21/cache/index2/level=3
+cpu/cpu21/cache/index2/shared_cpu_list=0-23
+cpu/cpu21/cache/index2/size=30720K
+cpu/cpu21/cache/index2/type=Unified
+cpu/cpu21/topology/cluster_id=72
+cpu/cpu21/topology/core_cpus_list=21
+cpu/cpu21/topology/core_id=37
+cpu/cpu21/topology/physical_package_id=0
+cpu/cpu22/cache/index0/level=1
+cpu/cpu22/cache/index0/shared_cpu_list=22
+cpu/cpu22/cache/index0/size=32K
+cpu/cpu22/cache/index0/type=Data
+cpu/cpu22/cache/index1/level=2
+cpu/cpu22/cache/index1/shared_cpu_list=20-23
+cpu/cpu22/cache/index1/size=4096K
+cpu/cpu22/cache/index1/type=Unified
+cpu/cpu22/cache/index2/level=3
+cpu/cpu22/cache/index2/shared_cpu_list=0-23
+cpu/cpu22/cache/index2/size=30720K
+cpu/cpu22/cache/index2/type=Unified
+cpu/cpu22/topology/cluster_id=72
+cpu/cpu22/topology/core_cpus_list=22
+cpu/cpu22/topology/core_id=38
+cpu/cpu22/topology/physical_package_id=0
+cpu/cpu23/cache/index0/level=1
+cpu/cpu23/cache/index0/shared_cpu_list=23
+cpu/cpu23/cache/index0/size=32K
+cpu/cpu23/cache/index0/type=Data
+cpu/cpu23/cache/index1/level=2
+cpu/cpu23/cache/index1/shared_cpu_list=20-23
+cpu/cpu23/cache/index1/size=4096K
+cpu/cpu23/cache/index1/type=Unified
+cpu/cpu23/cache/index2/level=3
+cpu/cpu23/cache/index2/shared_cpu_list=0-23
+cpu/cpu23/cache/index2/size=30720K
+cpu/cpu23/cache/index2/type=Unified
+cpu/cpu23/topology/cluster_id=72
+cpu/cpu23/topology/core_cpus_list=23
+cpu/cpu23/topology/core_id=39
+cpu/cpu23/topology/physical_package_id=0
+cpu/present=0-23
+node/node0/cpulist=0-23
+node/online=0
diff --git a/runtime/src/iree/task/testdata/sysfs/synthetic_snc.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/synthetic_snc.sysfs.txt
new file mode 100644
index 0000000..68e922a
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/synthetic_snc.sysfs.txt
@@ -0,0 +1,89 @@
+# SYNTHETIC machine (not a hardware capture): sub-NUMA clustering (Intel SNC /
+# AMD NPS shape). ONE physical package (physical_package_id=0 everywhere)
+# split into TWO NUMA nodes via /sys/devices/system/node: node0 = cpu 0-3,
+# node1 = cpu 4-7. Node identity must come from the node hierarchy; the
+# package id alone could not represent this split.
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/shared_cpu_list=0
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index1/level=2
+cpu/cpu0/cache/index1/shared_cpu_list=0
+cpu/cpu0/cache/index1/size=1024K
+cpu/cpu0/cache/index1/type=Unified
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/shared_cpu_list=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index1/level=2
+cpu/cpu1/cache/index1/shared_cpu_list=1
+cpu/cpu1/cache/index1/size=1024K
+cpu/cpu1/cache/index1/type=Unified
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/shared_cpu_list=2
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index1/level=2
+cpu/cpu2/cache/index1/shared_cpu_list=2
+cpu/cpu2/cache/index1/size=1024K
+cpu/cpu2/cache/index1/type=Unified
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/shared_cpu_list=3
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index1/level=2
+cpu/cpu3/cache/index1/shared_cpu_list=3
+cpu/cpu3/cache/index1/size=1024K
+cpu/cpu3/cache/index1/type=Unified
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/shared_cpu_list=4
+cpu/cpu4/cache/index0/size=32K
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index1/level=2
+cpu/cpu4/cache/index1/shared_cpu_list=4
+cpu/cpu4/cache/index1/size=1024K
+cpu/cpu4/cache/index1/type=Unified
+cpu/cpu4/topology/core_id=4
+cpu/cpu4/topology/physical_package_id=0
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/shared_cpu_list=5
+cpu/cpu5/cache/index0/size=32K
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index1/level=2
+cpu/cpu5/cache/index1/shared_cpu_list=5
+cpu/cpu5/cache/index1/size=1024K
+cpu/cpu5/cache/index1/type=Unified
+cpu/cpu5/topology/core_id=5
+cpu/cpu5/topology/physical_package_id=0
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/shared_cpu_list=6
+cpu/cpu6/cache/index0/size=32K
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index1/level=2
+cpu/cpu6/cache/index1/shared_cpu_list=6
+cpu/cpu6/cache/index1/size=1024K
+cpu/cpu6/cache/index1/type=Unified
+cpu/cpu6/topology/core_id=6
+cpu/cpu6/topology/physical_package_id=0
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/shared_cpu_list=7
+cpu/cpu7/cache/index0/size=32K
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index1/level=2
+cpu/cpu7/cache/index1/shared_cpu_list=7
+cpu/cpu7/cache/index1/size=1024K
+cpu/cpu7/cache/index1/type=Unified
+cpu/cpu7/topology/core_id=7
+cpu/cpu7/topology/physical_package_id=0
+cpu/present=0-7
+node/node0/cpulist=0,1,2,3
+node/node1/cpulist=4,5,6,7
+node/online=0,1
diff --git a/runtime/src/iree/task/testdata/sysfs/x86_64_ryzen9_7950x.sysfs.txt b/runtime/src/iree/task/testdata/sysfs/x86_64_ryzen9_7950x.sysfs.txt
new file mode 100644
index 0000000..e7e4d06
--- /dev/null
+++ b/runtime/src/iree/task/testdata/sysfs/x86_64_ryzen9_7950x.sysfs.txt
@@ -0,0 +1,650 @@
+# AMD Ryzen 9 7950X sysfs topology snapshot.
+# 16 cores / 32 SMT threads in one package: sibling pairs are NON-adjacent
+# (cpuN pairs with cpuN+16), two 8-core CCDs each with a private 32M L3
+# (0-7,16-23 and 8-15,24-31), one NUMA node, and topology/cluster_id reporting
+# the kernel's -1 "unavailable" sentinel (65535) on every cpu -- real-hardware
+# coverage for sentinel rejection in the 8-bit affinity group hint.
+cpu/present=0-31
+cpu/kernel_max=8191
+node/online=0
+node/node0/cpulist=0-31
+cpu/cpu0/topology/core_id=0
+cpu/cpu0/topology/physical_package_id=0
+cpu/cpu0/topology/cluster_id=65535
+cpu/cpu0/topology/core_cpus_list=0,16
+cpu/cpu0/cache/index0/type=Data
+cpu/cpu0/cache/index0/level=1
+cpu/cpu0/cache/index0/size=32K
+cpu/cpu0/cache/index0/shared_cpu_list=0,16
+cpu/cpu0/cache/index1/type=Instruction
+cpu/cpu0/cache/index1/level=1
+cpu/cpu0/cache/index1/size=32K
+cpu/cpu0/cache/index1/shared_cpu_list=0,16
+cpu/cpu0/cache/index2/type=Unified
+cpu/cpu0/cache/index2/level=2
+cpu/cpu0/cache/index2/size=1024K
+cpu/cpu0/cache/index2/shared_cpu_list=0,16
+cpu/cpu0/cache/index3/type=Unified
+cpu/cpu0/cache/index3/level=3
+cpu/cpu0/cache/index3/size=32768K
+cpu/cpu0/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu1/topology/core_id=1
+cpu/cpu1/topology/physical_package_id=0
+cpu/cpu1/topology/cluster_id=65535
+cpu/cpu1/topology/core_cpus_list=1,17
+cpu/cpu1/cache/index0/type=Data
+cpu/cpu1/cache/index0/level=1
+cpu/cpu1/cache/index0/size=32K
+cpu/cpu1/cache/index0/shared_cpu_list=1,17
+cpu/cpu1/cache/index1/type=Instruction
+cpu/cpu1/cache/index1/level=1
+cpu/cpu1/cache/index1/size=32K
+cpu/cpu1/cache/index1/shared_cpu_list=1,17
+cpu/cpu1/cache/index2/type=Unified
+cpu/cpu1/cache/index2/level=2
+cpu/cpu1/cache/index2/size=1024K
+cpu/cpu1/cache/index2/shared_cpu_list=1,17
+cpu/cpu1/cache/index3/type=Unified
+cpu/cpu1/cache/index3/level=3
+cpu/cpu1/cache/index3/size=32768K
+cpu/cpu1/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu10/topology/core_id=10
+cpu/cpu10/topology/physical_package_id=0
+cpu/cpu10/topology/cluster_id=65535
+cpu/cpu10/topology/core_cpus_list=10,26
+cpu/cpu10/cache/index0/type=Data
+cpu/cpu10/cache/index0/level=1
+cpu/cpu10/cache/index0/size=32K
+cpu/cpu10/cache/index0/shared_cpu_list=10,26
+cpu/cpu10/cache/index1/type=Instruction
+cpu/cpu10/cache/index1/level=1
+cpu/cpu10/cache/index1/size=32K
+cpu/cpu10/cache/index1/shared_cpu_list=10,26
+cpu/cpu10/cache/index2/type=Unified
+cpu/cpu10/cache/index2/level=2
+cpu/cpu10/cache/index2/size=1024K
+cpu/cpu10/cache/index2/shared_cpu_list=10,26
+cpu/cpu10/cache/index3/type=Unified
+cpu/cpu10/cache/index3/level=3
+cpu/cpu10/cache/index3/size=32768K
+cpu/cpu10/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu11/topology/core_id=11
+cpu/cpu11/topology/physical_package_id=0
+cpu/cpu11/topology/cluster_id=65535
+cpu/cpu11/topology/core_cpus_list=11,27
+cpu/cpu11/cache/index0/type=Data
+cpu/cpu11/cache/index0/level=1
+cpu/cpu11/cache/index0/size=32K
+cpu/cpu11/cache/index0/shared_cpu_list=11,27
+cpu/cpu11/cache/index1/type=Instruction
+cpu/cpu11/cache/index1/level=1
+cpu/cpu11/cache/index1/size=32K
+cpu/cpu11/cache/index1/shared_cpu_list=11,27
+cpu/cpu11/cache/index2/type=Unified
+cpu/cpu11/cache/index2/level=2
+cpu/cpu11/cache/index2/size=1024K
+cpu/cpu11/cache/index2/shared_cpu_list=11,27
+cpu/cpu11/cache/index3/type=Unified
+cpu/cpu11/cache/index3/level=3
+cpu/cpu11/cache/index3/size=32768K
+cpu/cpu11/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu12/topology/core_id=12
+cpu/cpu12/topology/physical_package_id=0
+cpu/cpu12/topology/cluster_id=65535
+cpu/cpu12/topology/core_cpus_list=12,28
+cpu/cpu12/cache/index0/type=Data
+cpu/cpu12/cache/index0/level=1
+cpu/cpu12/cache/index0/size=32K
+cpu/cpu12/cache/index0/shared_cpu_list=12,28
+cpu/cpu12/cache/index1/type=Instruction
+cpu/cpu12/cache/index1/level=1
+cpu/cpu12/cache/index1/size=32K
+cpu/cpu12/cache/index1/shared_cpu_list=12,28
+cpu/cpu12/cache/index2/type=Unified
+cpu/cpu12/cache/index2/level=2
+cpu/cpu12/cache/index2/size=1024K
+cpu/cpu12/cache/index2/shared_cpu_list=12,28
+cpu/cpu12/cache/index3/type=Unified
+cpu/cpu12/cache/index3/level=3
+cpu/cpu12/cache/index3/size=32768K
+cpu/cpu12/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu13/topology/core_id=13
+cpu/cpu13/topology/physical_package_id=0
+cpu/cpu13/topology/cluster_id=65535
+cpu/cpu13/topology/core_cpus_list=13,29
+cpu/cpu13/cache/index0/type=Data
+cpu/cpu13/cache/index0/level=1
+cpu/cpu13/cache/index0/size=32K
+cpu/cpu13/cache/index0/shared_cpu_list=13,29
+cpu/cpu13/cache/index1/type=Instruction
+cpu/cpu13/cache/index1/level=1
+cpu/cpu13/cache/index1/size=32K
+cpu/cpu13/cache/index1/shared_cpu_list=13,29
+cpu/cpu13/cache/index2/type=Unified
+cpu/cpu13/cache/index2/level=2
+cpu/cpu13/cache/index2/size=1024K
+cpu/cpu13/cache/index2/shared_cpu_list=13,29
+cpu/cpu13/cache/index3/type=Unified
+cpu/cpu13/cache/index3/level=3
+cpu/cpu13/cache/index3/size=32768K
+cpu/cpu13/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu14/topology/core_id=14
+cpu/cpu14/topology/physical_package_id=0
+cpu/cpu14/topology/cluster_id=65535
+cpu/cpu14/topology/core_cpus_list=14,30
+cpu/cpu14/cache/index0/type=Data
+cpu/cpu14/cache/index0/level=1
+cpu/cpu14/cache/index0/size=32K
+cpu/cpu14/cache/index0/shared_cpu_list=14,30
+cpu/cpu14/cache/index1/type=Instruction
+cpu/cpu14/cache/index1/level=1
+cpu/cpu14/cache/index1/size=32K
+cpu/cpu14/cache/index1/shared_cpu_list=14,30
+cpu/cpu14/cache/index2/type=Unified
+cpu/cpu14/cache/index2/level=2
+cpu/cpu14/cache/index2/size=1024K
+cpu/cpu14/cache/index2/shared_cpu_list=14,30
+cpu/cpu14/cache/index3/type=Unified
+cpu/cpu14/cache/index3/level=3
+cpu/cpu14/cache/index3/size=32768K
+cpu/cpu14/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu15/topology/core_id=15
+cpu/cpu15/topology/physical_package_id=0
+cpu/cpu15/topology/cluster_id=65535
+cpu/cpu15/topology/core_cpus_list=15,31
+cpu/cpu15/cache/index0/type=Data
+cpu/cpu15/cache/index0/level=1
+cpu/cpu15/cache/index0/size=32K
+cpu/cpu15/cache/index0/shared_cpu_list=15,31
+cpu/cpu15/cache/index1/type=Instruction
+cpu/cpu15/cache/index1/level=1
+cpu/cpu15/cache/index1/size=32K
+cpu/cpu15/cache/index1/shared_cpu_list=15,31
+cpu/cpu15/cache/index2/type=Unified
+cpu/cpu15/cache/index2/level=2
+cpu/cpu15/cache/index2/size=1024K
+cpu/cpu15/cache/index2/shared_cpu_list=15,31
+cpu/cpu15/cache/index3/type=Unified
+cpu/cpu15/cache/index3/level=3
+cpu/cpu15/cache/index3/size=32768K
+cpu/cpu15/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu16/topology/core_id=0
+cpu/cpu16/topology/physical_package_id=0
+cpu/cpu16/topology/cluster_id=65535
+cpu/cpu16/topology/core_cpus_list=0,16
+cpu/cpu16/cache/index0/type=Data
+cpu/cpu16/cache/index0/level=1
+cpu/cpu16/cache/index0/size=32K
+cpu/cpu16/cache/index0/shared_cpu_list=0,16
+cpu/cpu16/cache/index1/type=Instruction
+cpu/cpu16/cache/index1/level=1
+cpu/cpu16/cache/index1/size=32K
+cpu/cpu16/cache/index1/shared_cpu_list=0,16
+cpu/cpu16/cache/index2/type=Unified
+cpu/cpu16/cache/index2/level=2
+cpu/cpu16/cache/index2/size=1024K
+cpu/cpu16/cache/index2/shared_cpu_list=0,16
+cpu/cpu16/cache/index3/type=Unified
+cpu/cpu16/cache/index3/level=3
+cpu/cpu16/cache/index3/size=32768K
+cpu/cpu16/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu17/topology/core_id=1
+cpu/cpu17/topology/physical_package_id=0
+cpu/cpu17/topology/cluster_id=65535
+cpu/cpu17/topology/core_cpus_list=1,17
+cpu/cpu17/cache/index0/type=Data
+cpu/cpu17/cache/index0/level=1
+cpu/cpu17/cache/index0/size=32K
+cpu/cpu17/cache/index0/shared_cpu_list=1,17
+cpu/cpu17/cache/index1/type=Instruction
+cpu/cpu17/cache/index1/level=1
+cpu/cpu17/cache/index1/size=32K
+cpu/cpu17/cache/index1/shared_cpu_list=1,17
+cpu/cpu17/cache/index2/type=Unified
+cpu/cpu17/cache/index2/level=2
+cpu/cpu17/cache/index2/size=1024K
+cpu/cpu17/cache/index2/shared_cpu_list=1,17
+cpu/cpu17/cache/index3/type=Unified
+cpu/cpu17/cache/index3/level=3
+cpu/cpu17/cache/index3/size=32768K
+cpu/cpu17/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu18/topology/core_id=2
+cpu/cpu18/topology/physical_package_id=0
+cpu/cpu18/topology/cluster_id=65535
+cpu/cpu18/topology/core_cpus_list=2,18
+cpu/cpu18/cache/index0/type=Data
+cpu/cpu18/cache/index0/level=1
+cpu/cpu18/cache/index0/size=32K
+cpu/cpu18/cache/index0/shared_cpu_list=2,18
+cpu/cpu18/cache/index1/type=Instruction
+cpu/cpu18/cache/index1/level=1
+cpu/cpu18/cache/index1/size=32K
+cpu/cpu18/cache/index1/shared_cpu_list=2,18
+cpu/cpu18/cache/index2/type=Unified
+cpu/cpu18/cache/index2/level=2
+cpu/cpu18/cache/index2/size=1024K
+cpu/cpu18/cache/index2/shared_cpu_list=2,18
+cpu/cpu18/cache/index3/type=Unified
+cpu/cpu18/cache/index3/level=3
+cpu/cpu18/cache/index3/size=32768K
+cpu/cpu18/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu19/topology/core_id=3
+cpu/cpu19/topology/physical_package_id=0
+cpu/cpu19/topology/cluster_id=65535
+cpu/cpu19/topology/core_cpus_list=3,19
+cpu/cpu19/cache/index0/type=Data
+cpu/cpu19/cache/index0/level=1
+cpu/cpu19/cache/index0/size=32K
+cpu/cpu19/cache/index0/shared_cpu_list=3,19
+cpu/cpu19/cache/index1/type=Instruction
+cpu/cpu19/cache/index1/level=1
+cpu/cpu19/cache/index1/size=32K
+cpu/cpu19/cache/index1/shared_cpu_list=3,19
+cpu/cpu19/cache/index2/type=Unified
+cpu/cpu19/cache/index2/level=2
+cpu/cpu19/cache/index2/size=1024K
+cpu/cpu19/cache/index2/shared_cpu_list=3,19
+cpu/cpu19/cache/index3/type=Unified
+cpu/cpu19/cache/index3/level=3
+cpu/cpu19/cache/index3/size=32768K
+cpu/cpu19/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu2/topology/core_id=2
+cpu/cpu2/topology/physical_package_id=0
+cpu/cpu2/topology/cluster_id=65535
+cpu/cpu2/topology/core_cpus_list=2,18
+cpu/cpu2/cache/index0/type=Data
+cpu/cpu2/cache/index0/level=1
+cpu/cpu2/cache/index0/size=32K
+cpu/cpu2/cache/index0/shared_cpu_list=2,18
+cpu/cpu2/cache/index1/type=Instruction
+cpu/cpu2/cache/index1/level=1
+cpu/cpu2/cache/index1/size=32K
+cpu/cpu2/cache/index1/shared_cpu_list=2,18
+cpu/cpu2/cache/index2/type=Unified
+cpu/cpu2/cache/index2/level=2
+cpu/cpu2/cache/index2/size=1024K
+cpu/cpu2/cache/index2/shared_cpu_list=2,18
+cpu/cpu2/cache/index3/type=Unified
+cpu/cpu2/cache/index3/level=3
+cpu/cpu2/cache/index3/size=32768K
+cpu/cpu2/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu20/topology/core_id=4
+cpu/cpu20/topology/physical_package_id=0
+cpu/cpu20/topology/cluster_id=65535
+cpu/cpu20/topology/core_cpus_list=4,20
+cpu/cpu20/cache/index0/type=Data
+cpu/cpu20/cache/index0/level=1
+cpu/cpu20/cache/index0/size=32K
+cpu/cpu20/cache/index0/shared_cpu_list=4,20
+cpu/cpu20/cache/index1/type=Instruction
+cpu/cpu20/cache/index1/level=1
+cpu/cpu20/cache/index1/size=32K
+cpu/cpu20/cache/index1/shared_cpu_list=4,20
+cpu/cpu20/cache/index2/type=Unified
+cpu/cpu20/cache/index2/level=2
+cpu/cpu20/cache/index2/size=1024K
+cpu/cpu20/cache/index2/shared_cpu_list=4,20
+cpu/cpu20/cache/index3/type=Unified
+cpu/cpu20/cache/index3/level=3
+cpu/cpu20/cache/index3/size=32768K
+cpu/cpu20/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu21/topology/core_id=5
+cpu/cpu21/topology/physical_package_id=0
+cpu/cpu21/topology/cluster_id=65535
+cpu/cpu21/topology/core_cpus_list=5,21
+cpu/cpu21/cache/index0/type=Data
+cpu/cpu21/cache/index0/level=1
+cpu/cpu21/cache/index0/size=32K
+cpu/cpu21/cache/index0/shared_cpu_list=5,21
+cpu/cpu21/cache/index1/type=Instruction
+cpu/cpu21/cache/index1/level=1
+cpu/cpu21/cache/index1/size=32K
+cpu/cpu21/cache/index1/shared_cpu_list=5,21
+cpu/cpu21/cache/index2/type=Unified
+cpu/cpu21/cache/index2/level=2
+cpu/cpu21/cache/index2/size=1024K
+cpu/cpu21/cache/index2/shared_cpu_list=5,21
+cpu/cpu21/cache/index3/type=Unified
+cpu/cpu21/cache/index3/level=3
+cpu/cpu21/cache/index3/size=32768K
+cpu/cpu21/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu22/topology/core_id=6
+cpu/cpu22/topology/physical_package_id=0
+cpu/cpu22/topology/cluster_id=65535
+cpu/cpu22/topology/core_cpus_list=6,22
+cpu/cpu22/cache/index0/type=Data
+cpu/cpu22/cache/index0/level=1
+cpu/cpu22/cache/index0/size=32K
+cpu/cpu22/cache/index0/shared_cpu_list=6,22
+cpu/cpu22/cache/index1/type=Instruction
+cpu/cpu22/cache/index1/level=1
+cpu/cpu22/cache/index1/size=32K
+cpu/cpu22/cache/index1/shared_cpu_list=6,22
+cpu/cpu22/cache/index2/type=Unified
+cpu/cpu22/cache/index2/level=2
+cpu/cpu22/cache/index2/size=1024K
+cpu/cpu22/cache/index2/shared_cpu_list=6,22
+cpu/cpu22/cache/index3/type=Unified
+cpu/cpu22/cache/index3/level=3
+cpu/cpu22/cache/index3/size=32768K
+cpu/cpu22/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu23/topology/core_id=7
+cpu/cpu23/topology/physical_package_id=0
+cpu/cpu23/topology/cluster_id=65535
+cpu/cpu23/topology/core_cpus_list=7,23
+cpu/cpu23/cache/index0/type=Data
+cpu/cpu23/cache/index0/level=1
+cpu/cpu23/cache/index0/size=32K
+cpu/cpu23/cache/index0/shared_cpu_list=7,23
+cpu/cpu23/cache/index1/type=Instruction
+cpu/cpu23/cache/index1/level=1
+cpu/cpu23/cache/index1/size=32K
+cpu/cpu23/cache/index1/shared_cpu_list=7,23
+cpu/cpu23/cache/index2/type=Unified
+cpu/cpu23/cache/index2/level=2
+cpu/cpu23/cache/index2/size=1024K
+cpu/cpu23/cache/index2/shared_cpu_list=7,23
+cpu/cpu23/cache/index3/type=Unified
+cpu/cpu23/cache/index3/level=3
+cpu/cpu23/cache/index3/size=32768K
+cpu/cpu23/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu24/topology/core_id=8
+cpu/cpu24/topology/physical_package_id=0
+cpu/cpu24/topology/cluster_id=65535
+cpu/cpu24/topology/core_cpus_list=8,24
+cpu/cpu24/cache/index0/type=Data
+cpu/cpu24/cache/index0/level=1
+cpu/cpu24/cache/index0/size=32K
+cpu/cpu24/cache/index0/shared_cpu_list=8,24
+cpu/cpu24/cache/index1/type=Instruction
+cpu/cpu24/cache/index1/level=1
+cpu/cpu24/cache/index1/size=32K
+cpu/cpu24/cache/index1/shared_cpu_list=8,24
+cpu/cpu24/cache/index2/type=Unified
+cpu/cpu24/cache/index2/level=2
+cpu/cpu24/cache/index2/size=1024K
+cpu/cpu24/cache/index2/shared_cpu_list=8,24
+cpu/cpu24/cache/index3/type=Unified
+cpu/cpu24/cache/index3/level=3
+cpu/cpu24/cache/index3/size=32768K
+cpu/cpu24/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu25/topology/core_id=9
+cpu/cpu25/topology/physical_package_id=0
+cpu/cpu25/topology/cluster_id=65535
+cpu/cpu25/topology/core_cpus_list=9,25
+cpu/cpu25/cache/index0/type=Data
+cpu/cpu25/cache/index0/level=1
+cpu/cpu25/cache/index0/size=32K
+cpu/cpu25/cache/index0/shared_cpu_list=9,25
+cpu/cpu25/cache/index1/type=Instruction
+cpu/cpu25/cache/index1/level=1
+cpu/cpu25/cache/index1/size=32K
+cpu/cpu25/cache/index1/shared_cpu_list=9,25
+cpu/cpu25/cache/index2/type=Unified
+cpu/cpu25/cache/index2/level=2
+cpu/cpu25/cache/index2/size=1024K
+cpu/cpu25/cache/index2/shared_cpu_list=9,25
+cpu/cpu25/cache/index3/type=Unified
+cpu/cpu25/cache/index3/level=3
+cpu/cpu25/cache/index3/size=32768K
+cpu/cpu25/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu26/topology/core_id=10
+cpu/cpu26/topology/physical_package_id=0
+cpu/cpu26/topology/cluster_id=65535
+cpu/cpu26/topology/core_cpus_list=10,26
+cpu/cpu26/cache/index0/type=Data
+cpu/cpu26/cache/index0/level=1
+cpu/cpu26/cache/index0/size=32K
+cpu/cpu26/cache/index0/shared_cpu_list=10,26
+cpu/cpu26/cache/index1/type=Instruction
+cpu/cpu26/cache/index1/level=1
+cpu/cpu26/cache/index1/size=32K
+cpu/cpu26/cache/index1/shared_cpu_list=10,26
+cpu/cpu26/cache/index2/type=Unified
+cpu/cpu26/cache/index2/level=2
+cpu/cpu26/cache/index2/size=1024K
+cpu/cpu26/cache/index2/shared_cpu_list=10,26
+cpu/cpu26/cache/index3/type=Unified
+cpu/cpu26/cache/index3/level=3
+cpu/cpu26/cache/index3/size=32768K
+cpu/cpu26/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu27/topology/core_id=11
+cpu/cpu27/topology/physical_package_id=0
+cpu/cpu27/topology/cluster_id=65535
+cpu/cpu27/topology/core_cpus_list=11,27
+cpu/cpu27/cache/index0/type=Data
+cpu/cpu27/cache/index0/level=1
+cpu/cpu27/cache/index0/size=32K
+cpu/cpu27/cache/index0/shared_cpu_list=11,27
+cpu/cpu27/cache/index1/type=Instruction
+cpu/cpu27/cache/index1/level=1
+cpu/cpu27/cache/index1/size=32K
+cpu/cpu27/cache/index1/shared_cpu_list=11,27
+cpu/cpu27/cache/index2/type=Unified
+cpu/cpu27/cache/index2/level=2
+cpu/cpu27/cache/index2/size=1024K
+cpu/cpu27/cache/index2/shared_cpu_list=11,27
+cpu/cpu27/cache/index3/type=Unified
+cpu/cpu27/cache/index3/level=3
+cpu/cpu27/cache/index3/size=32768K
+cpu/cpu27/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu28/topology/core_id=12
+cpu/cpu28/topology/physical_package_id=0
+cpu/cpu28/topology/cluster_id=65535
+cpu/cpu28/topology/core_cpus_list=12,28
+cpu/cpu28/cache/index0/type=Data
+cpu/cpu28/cache/index0/level=1
+cpu/cpu28/cache/index0/size=32K
+cpu/cpu28/cache/index0/shared_cpu_list=12,28
+cpu/cpu28/cache/index1/type=Instruction
+cpu/cpu28/cache/index1/level=1
+cpu/cpu28/cache/index1/size=32K
+cpu/cpu28/cache/index1/shared_cpu_list=12,28
+cpu/cpu28/cache/index2/type=Unified
+cpu/cpu28/cache/index2/level=2
+cpu/cpu28/cache/index2/size=1024K
+cpu/cpu28/cache/index2/shared_cpu_list=12,28
+cpu/cpu28/cache/index3/type=Unified
+cpu/cpu28/cache/index3/level=3
+cpu/cpu28/cache/index3/size=32768K
+cpu/cpu28/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu29/topology/core_id=13
+cpu/cpu29/topology/physical_package_id=0
+cpu/cpu29/topology/cluster_id=65535
+cpu/cpu29/topology/core_cpus_list=13,29
+cpu/cpu29/cache/index0/type=Data
+cpu/cpu29/cache/index0/level=1
+cpu/cpu29/cache/index0/size=32K
+cpu/cpu29/cache/index0/shared_cpu_list=13,29
+cpu/cpu29/cache/index1/type=Instruction
+cpu/cpu29/cache/index1/level=1
+cpu/cpu29/cache/index1/size=32K
+cpu/cpu29/cache/index1/shared_cpu_list=13,29
+cpu/cpu29/cache/index2/type=Unified
+cpu/cpu29/cache/index2/level=2
+cpu/cpu29/cache/index2/size=1024K
+cpu/cpu29/cache/index2/shared_cpu_list=13,29
+cpu/cpu29/cache/index3/type=Unified
+cpu/cpu29/cache/index3/level=3
+cpu/cpu29/cache/index3/size=32768K
+cpu/cpu29/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu3/topology/core_id=3
+cpu/cpu3/topology/physical_package_id=0
+cpu/cpu3/topology/cluster_id=65535
+cpu/cpu3/topology/core_cpus_list=3,19
+cpu/cpu3/cache/index0/type=Data
+cpu/cpu3/cache/index0/level=1
+cpu/cpu3/cache/index0/size=32K
+cpu/cpu3/cache/index0/shared_cpu_list=3,19
+cpu/cpu3/cache/index1/type=Instruction
+cpu/cpu3/cache/index1/level=1
+cpu/cpu3/cache/index1/size=32K
+cpu/cpu3/cache/index1/shared_cpu_list=3,19
+cpu/cpu3/cache/index2/type=Unified
+cpu/cpu3/cache/index2/level=2
+cpu/cpu3/cache/index2/size=1024K
+cpu/cpu3/cache/index2/shared_cpu_list=3,19
+cpu/cpu3/cache/index3/type=Unified
+cpu/cpu3/cache/index3/level=3
+cpu/cpu3/cache/index3/size=32768K
+cpu/cpu3/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu30/topology/core_id=14
+cpu/cpu30/topology/physical_package_id=0
+cpu/cpu30/topology/cluster_id=65535
+cpu/cpu30/topology/core_cpus_list=14,30
+cpu/cpu30/cache/index0/type=Data
+cpu/cpu30/cache/index0/level=1
+cpu/cpu30/cache/index0/size=32K
+cpu/cpu30/cache/index0/shared_cpu_list=14,30
+cpu/cpu30/cache/index1/type=Instruction
+cpu/cpu30/cache/index1/level=1
+cpu/cpu30/cache/index1/size=32K
+cpu/cpu30/cache/index1/shared_cpu_list=14,30
+cpu/cpu30/cache/index2/type=Unified
+cpu/cpu30/cache/index2/level=2
+cpu/cpu30/cache/index2/size=1024K
+cpu/cpu30/cache/index2/shared_cpu_list=14,30
+cpu/cpu30/cache/index3/type=Unified
+cpu/cpu30/cache/index3/level=3
+cpu/cpu30/cache/index3/size=32768K
+cpu/cpu30/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu31/topology/core_id=15
+cpu/cpu31/topology/physical_package_id=0
+cpu/cpu31/topology/cluster_id=65535
+cpu/cpu31/topology/core_cpus_list=15,31
+cpu/cpu31/cache/index0/type=Data
+cpu/cpu31/cache/index0/level=1
+cpu/cpu31/cache/index0/size=32K
+cpu/cpu31/cache/index0/shared_cpu_list=15,31
+cpu/cpu31/cache/index1/type=Instruction
+cpu/cpu31/cache/index1/level=1
+cpu/cpu31/cache/index1/size=32K
+cpu/cpu31/cache/index1/shared_cpu_list=15,31
+cpu/cpu31/cache/index2/type=Unified
+cpu/cpu31/cache/index2/level=2
+cpu/cpu31/cache/index2/size=1024K
+cpu/cpu31/cache/index2/shared_cpu_list=15,31
+cpu/cpu31/cache/index3/type=Unified
+cpu/cpu31/cache/index3/level=3
+cpu/cpu31/cache/index3/size=32768K
+cpu/cpu31/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu4/topology/core_id=4
+cpu/cpu4/topology/physical_package_id=0
+cpu/cpu4/topology/cluster_id=65535
+cpu/cpu4/topology/core_cpus_list=4,20
+cpu/cpu4/cache/index0/type=Data
+cpu/cpu4/cache/index0/level=1
+cpu/cpu4/cache/index0/size=32K
+cpu/cpu4/cache/index0/shared_cpu_list=4,20
+cpu/cpu4/cache/index1/type=Instruction
+cpu/cpu4/cache/index1/level=1
+cpu/cpu4/cache/index1/size=32K
+cpu/cpu4/cache/index1/shared_cpu_list=4,20
+cpu/cpu4/cache/index2/type=Unified
+cpu/cpu4/cache/index2/level=2
+cpu/cpu4/cache/index2/size=1024K
+cpu/cpu4/cache/index2/shared_cpu_list=4,20
+cpu/cpu4/cache/index3/type=Unified
+cpu/cpu4/cache/index3/level=3
+cpu/cpu4/cache/index3/size=32768K
+cpu/cpu4/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu5/topology/core_id=5
+cpu/cpu5/topology/physical_package_id=0
+cpu/cpu5/topology/cluster_id=65535
+cpu/cpu5/topology/core_cpus_list=5,21
+cpu/cpu5/cache/index0/type=Data
+cpu/cpu5/cache/index0/level=1
+cpu/cpu5/cache/index0/size=32K
+cpu/cpu5/cache/index0/shared_cpu_list=5,21
+cpu/cpu5/cache/index1/type=Instruction
+cpu/cpu5/cache/index1/level=1
+cpu/cpu5/cache/index1/size=32K
+cpu/cpu5/cache/index1/shared_cpu_list=5,21
+cpu/cpu5/cache/index2/type=Unified
+cpu/cpu5/cache/index2/level=2
+cpu/cpu5/cache/index2/size=1024K
+cpu/cpu5/cache/index2/shared_cpu_list=5,21
+cpu/cpu5/cache/index3/type=Unified
+cpu/cpu5/cache/index3/level=3
+cpu/cpu5/cache/index3/size=32768K
+cpu/cpu5/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu6/topology/core_id=6
+cpu/cpu6/topology/physical_package_id=0
+cpu/cpu6/topology/cluster_id=65535
+cpu/cpu6/topology/core_cpus_list=6,22
+cpu/cpu6/cache/index0/type=Data
+cpu/cpu6/cache/index0/level=1
+cpu/cpu6/cache/index0/size=32K
+cpu/cpu6/cache/index0/shared_cpu_list=6,22
+cpu/cpu6/cache/index1/type=Instruction
+cpu/cpu6/cache/index1/level=1
+cpu/cpu6/cache/index1/size=32K
+cpu/cpu6/cache/index1/shared_cpu_list=6,22
+cpu/cpu6/cache/index2/type=Unified
+cpu/cpu6/cache/index2/level=2
+cpu/cpu6/cache/index2/size=1024K
+cpu/cpu6/cache/index2/shared_cpu_list=6,22
+cpu/cpu6/cache/index3/type=Unified
+cpu/cpu6/cache/index3/level=3
+cpu/cpu6/cache/index3/size=32768K
+cpu/cpu6/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu7/topology/core_id=7
+cpu/cpu7/topology/physical_package_id=0
+cpu/cpu7/topology/cluster_id=65535
+cpu/cpu7/topology/core_cpus_list=7,23
+cpu/cpu7/cache/index0/type=Data
+cpu/cpu7/cache/index0/level=1
+cpu/cpu7/cache/index0/size=32K
+cpu/cpu7/cache/index0/shared_cpu_list=7,23
+cpu/cpu7/cache/index1/type=Instruction
+cpu/cpu7/cache/index1/level=1
+cpu/cpu7/cache/index1/size=32K
+cpu/cpu7/cache/index1/shared_cpu_list=7,23
+cpu/cpu7/cache/index2/type=Unified
+cpu/cpu7/cache/index2/level=2
+cpu/cpu7/cache/index2/size=1024K
+cpu/cpu7/cache/index2/shared_cpu_list=7,23
+cpu/cpu7/cache/index3/type=Unified
+cpu/cpu7/cache/index3/level=3
+cpu/cpu7/cache/index3/size=32768K
+cpu/cpu7/cache/index3/shared_cpu_list=0-7,16-23
+cpu/cpu8/topology/core_id=8
+cpu/cpu8/topology/physical_package_id=0
+cpu/cpu8/topology/cluster_id=65535
+cpu/cpu8/topology/core_cpus_list=8,24
+cpu/cpu8/cache/index0/type=Data
+cpu/cpu8/cache/index0/level=1
+cpu/cpu8/cache/index0/size=32K
+cpu/cpu8/cache/index0/shared_cpu_list=8,24
+cpu/cpu8/cache/index1/type=Instruction
+cpu/cpu8/cache/index1/level=1
+cpu/cpu8/cache/index1/size=32K
+cpu/cpu8/cache/index1/shared_cpu_list=8,24
+cpu/cpu8/cache/index2/type=Unified
+cpu/cpu8/cache/index2/level=2
+cpu/cpu8/cache/index2/size=1024K
+cpu/cpu8/cache/index2/shared_cpu_list=8,24
+cpu/cpu8/cache/index3/type=Unified
+cpu/cpu8/cache/index3/level=3
+cpu/cpu8/cache/index3/size=32768K
+cpu/cpu8/cache/index3/shared_cpu_list=8-15,24-31
+cpu/cpu9/topology/core_id=9
+cpu/cpu9/topology/physical_package_id=0
+cpu/cpu9/topology/cluster_id=65535
+cpu/cpu9/topology/core_cpus_list=9,25
+cpu/cpu9/cache/index0/type=Data
+cpu/cpu9/cache/index0/level=1
+cpu/cpu9/cache/index0/size=32K
+cpu/cpu9/cache/index0/shared_cpu_list=9,25
+cpu/cpu9/cache/index1/type=Instruction
+cpu/cpu9/cache/index1/level=1
+cpu/cpu9/cache/index1/size=32K
+cpu/cpu9/cache/index1/shared_cpu_list=9,25
+cpu/cpu9/cache/index2/type=Unified
+cpu/cpu9/cache/index2/level=2
+cpu/cpu9/cache/index2/size=1024K
+cpu/cpu9/cache/index2/shared_cpu_list=9,25
+cpu/cpu9/cache/index3/type=Unified
+cpu/cpu9/cache/index3/level=3
+cpu/cpu9/cache/index3/size=32768K
+cpu/cpu9/cache/index3/shared_cpu_list=8-15,24-31