Я работаю над инструментом, позволяющим студентам самостоятельно оценивать производительность их программирования. В частности, программа, которую они пишут, имеет многопоточность, и у меня нет прямого способа повлиять на количество созданных потоков. Я бы хотел сравнить производительность своих программ с различным количеством ядер (и в идеале их программы должны ускоряться примерно пропорционально количеству ядер, которые разрешено использовать).
Мы можем передать битмаску Process.SetAffinity для управления ядрами, которые использует программа.
Это проблема на машинах i5 и i7, которые используют гиперпоточность и разделяют каждое физическое ядро на два логических. Я хочу, чтобы программа работала на двух/четырех различных физических ядрах. На моей машине i7 процесс с аффинностью, установленный в 3 (ядра 0 и 1), будет работать примерно так же быстро, как программа на одном ядре (указав, что эти логические ядра имеют одно и то же физическое ядро), но с аффинностью, установленной на 5 (ядра 0 & 3) он будет работать намного быстрее (это означает, что эти ядра используют разные физические ядра). Тем не менее, я не нашел надежного способа (кроме проб и ошибок), чтобы определить это.
Как я могу (без экспериментов) определить, какие логические ядра имеют одно и то же физическое ядро?
(/proc/cpuinfo содержит информацию, которая мне нужна, но которая недоступна на машинах Windows.)