diff --git a/html/input.php b/html/input.php
index 22df9ef..ae8eaa2 100644
--- a/html/input.php
+++ b/html/input.php
@@ -1,6 +1,7 @@
0, "allocations" => []];
+ return is_array($state) ? $state : ["cursor" => 0, "allocations" => []];
}
function saveCoreState(array $state): void
@@ -33,13 +34,13 @@ function getNumaTopology(): array
{
$nodes = [];
- /* discover nodes */
+ /* discover NUMA nodes */
foreach (glob('/sys/devices/system/node/node*') as $nodePath) {
$node = (int)str_replace('node', '', basename($nodePath));
$nodes[$node] = [];
}
- /* read cpu → node + core_id */
+ /* map cpu -> node -> core_id */
foreach (glob('/sys/devices/system/cpu/cpu[0-9]*') as $cpuPath) {
$cpu = (int)str_replace('cpu', '', basename($cpuPath));
$topo = "$cpuPath/topology";
@@ -77,45 +78,36 @@ function getNumaTopology(): array
/* ---------------------------------------------------------
BUILD GLOBAL ROUND-ROBIN PLAN
+ EVEN CPUs FIRST → ODD CPUs
--------------------------------------------------------- */
function buildAllocationPlan(array $nodes): array
{
- $plan = [];
+ $even = [];
+ $odd = [];
- if (empty($nodes)) {
- return $plan;
- }
-
- $maxCores = max(array_map('count', $nodes));
-
- /* PASS 1 — physical cores only */
- for ($i = 0; $i < $maxCores; $i++) {
- foreach ($nodes as $node => $cores) {
- $coreIds = array_keys($cores);
- if (isset($coreIds[$i])) {
- $plan[] = [
+ foreach ($nodes as $node => $cores) {
+ foreach ($cores as $coreId => $threads) {
+ foreach ($threads as $cpu) {
+ $entry = [
"node" => $node,
- "cpu" => $cores[$coreIds[$i]][0]
+ "cpu" => $cpu
];
+
+ if (($cpu % 2) === 0) {
+ $even[] = $entry;
+ } else {
+ $odd[] = $entry;
+ }
}
}
}
- /* PASS 2 — SMT siblings */
- for ($i = 0; $i < $maxCores; $i++) {
- foreach ($nodes as $node => $cores) {
- $coreIds = array_keys($cores);
- if (isset($coreIds[$i]) && count($cores[$coreIds[$i]]) > 1) {
- $plan[] = [
- "node" => $node,
- "cpu" => $cores[$coreIds[$i]][1]
- ];
- }
- }
- }
+ /* deterministic ordering */
+ usort($even, fn($a, $b) => $a["cpu"] <=> $b["cpu"]);
+ usort($odd, fn($a, $b) => $a["cpu"] <=> $b["cpu"]);
- return $plan;
+ return array_merge($even, $odd);
}
/* ---------------------------------------------------------