Они предполагается, что должны чередоваться, так что выбор последовательных ядер максимально увеличивает нагрузку. Если бы 0 и 1 были на одном чипе, то простой код, который использовал только два ядра, потратил бы половину кеша.
Таким образом, нумерованные ядра должны сначала чередовать физические процессоры. Затем они должны поочередно умереть, если это возможно. Затем они должны пройти через ядра на одном кристалле. Затем они должны включать виртуальные ядра, если это возможно.
Итак, если у вас было два физических ЦП (P1, P2), каждое двухъядерное (C1, C2) и каждое гиперпоточное (V1, V2), ядра должны работать:
P1C1V1, P2C1V1, P1C2V1, P2C2V1, P1C1V2, P2C1V2, P1C2V2, P2C2V2
Смысл в том, чтобы код, не понимающий топологию ЦП, мог просто захватить столько ядер, сколько он знает, как использовать и получить оптимальную производительность. Если бы вы могли поддерживать только два ядра, вам нужны P1C1V1 и P2C1V1, а не P1C1V1 и P1C1V2, иначе вы бы потратили огромное количество кеша и единиц выполнения.