Я запускаю свою службу NT на машине Win2k3 на базе Intel Core2, где мне нужно перебирать все логические процессоры (все биты в сродстве к процессу). Для этого я называю GetProcessAffinityMask(), чтобы получить маску системы сродства, а затем переключить процесс на каждый процессор, в своей очереди:Код для определения идентификатора APIC возвращает те же идентификаторы для разных логических процессоров
DWORD systemMask;
GetProcessAffinityMask(... &systemMask);
DWORD processorId = 1;
while(systemMask != 0) {
SetProcessAffinityMask(... processorId);
Sleep(1); // to be sure that it shifts to that processor
systemMask >>= 1;
processorId <<= 1;
}
На каждой итерации я призываю code from here для получения текущего процессора APIC идентификатора. Проблема в том, что для разных процессоров она иногда возвращает идентичные идентификаторы APIC. Согласно документации каждый процессор в системе должен иметь идентичный идентификатор.
Я попытался отладки это - проверено на самом деле изменяет ли Windows, сродства:
while(systemMask != 0) {
SetProcessAffinityMask(... processorId);
Sleep(1); // to be sure that it shifts to that processor
DWORD tempAffinity;
GetProcessAffinityMask(... &tempAffinity);
// run APIC id detection code here
systemMask >>= 1;
processorId <<= 1;
}
Он возвращает точно маску схожести я ожидаю, но APIC идентификаторы еще могут быть одинаковыми для разных процессоров.
Есть ли объяснение этой странной ситуации?
Если бы это было так, не было ли это воспроизводимым на всех машинах? Я компилирую один раз и запускаю на нескольких машинах, и только пара из них демонстрирует это поведение, все остальные работают должным образом. – sharptooth
Хммм, да, это было бы ... Лучше всего выкинуть WinDbg и расследовать дальше. Я также помню законные ошибки Intel об этом, что мы должны были работать в ОС, поэтому было бы возможно, что вы нашли его, если он на 100% воспроизводится на определенных машинах.Являются ли эти относительно новые процессоры? –
'cpuid' не может использоваться в встроенной сборке, но существует [' __cpuid'] (http://msdn.microsoft.com/en-us/library/hskdteyh.aspx), который отлично работает с назначением регистра компилятора , –