Гиперпоточность отключена в BIOS, но все еще отображается в CPUID
Я сделал функцию (см. Ниже), которая определяет, есть ли у ядра процессора Hyper-Threading. Когда я отключаю Hyper-Threading в BIOS, CPUID по-прежнему сообщает, что ядро имеет Hyper-Threading. Как я могу сделать это правильно, чтобы узнать, включена ли Hyper-Threading?
// input: eax = functionnumber, ecx = 0
// output: eax = output[0], ebx = output[1], ecx = output[2], edx = output[3]
//static inline void cpuid (int output[4], int functionnumber)
bool hasHyperThreading() {
int abcd[4];
cpuid(abcd,1);
return (1<<28) & abcd[3];
}
1 ответ
Ответ на первую часть вашего вопроса "по историческим причинам", то есть этот бит все еще включен даже для процессора, который является только многоядерным; подробности здесь.
Чтобы выяснить, включен ли HT, вам нужно перечислить активные логические процессоры; как это сделать зависит от ОС. Затем для каждого активного логического процессора получите свой идентификатор x2APIC (вам нужно запустить его, чтобы получить его, поэтому вам нужно иметь возможность установить привязку к потоку к процессору) и протестировать последний бит. Если HT не включен, то этот бит не будет установлен ни для одного логического процессора. Хороший исходный код для этого предоставлен Intel. Я вижу, что Z boson предоставил альтернативный метод, основанный на OpenMP, который, тем не менее, нуждается в небольшом тике, чтобы фактически ответить на заданный вопрос (см. Мой комментарий там).
Кроме того, насколько я знаю, у AMD в настоящее время нет гиперпоточности ни для одного из их процессоров.