> On a system that has SNC disabled the function reports both "node_cpus" > and "cache_cpus" equal to 56. In this case snc_ways() returns "2". It is > the same on a system with SNC enabled that reports the previously mentioned > variables to be different by a factor of two (36 and 72). > Is it possible for node_cpus and cache_cpus to not be multiples of each > other? (as in for example cache_cpus being 10 and node_cpus being 21?). > If not I'd suggest using "==" instead of ">=". Some CPUs may be offline when the test is run. E.g. with one CPU offline on SNC node 0, you'd see node_cpus = 35 and cache_cpus = 71. But with one CPU offline on node 1, you'd have node_cpus = 36, cache_cpus = 71. > If yes then I guess something like this could work? : + if (node_cpus >= cache_cpus) + return 1; + else if (2 * node_cpus >= cache_cpus) + return 2; + else if (4 * node_cpus >= cache_cpus) + return 4; This returns "4" for the 36 71 case. But should still be "2". >> PS. I did my tests on two Intel Ice Lakes. Perhaps easier to play with the algorithm in user code? #include <stdio.h> #include <stdlib.h> static int snc(int node_cpus, int cache_cpus) { if (node_cpus >= cache_cpus) return 1; else if (2 * node_cpus >= cache_cpus) return 2; else if (4 * node_cpus >= cache_cpus) return 4; return -1; } int main(int argc, char **argv) { printf("%d\n", snc(atoi(argv[1]), atoi(argv[2]))); return 0; } N.B. it's probably not possible to handle the case where somebody took ALL the CPUs in SNC node 1 offline (or SNC nodes 1,2,3 for the SNC 4 case). I think it reasonable that the code handle some simple "small number of CPUs offline" cases. But don't worry too much about cases where the user has done something extreme. -Tony