Инструкции по сборке, чтобы узнать, сколько потоков включено в многоядерной системе - PullRequest
5 голосов
/ 26 апреля 2009

Я работаю на чистой системе, в которой мне нужно определить через некоторое время после загрузки, сколько ядер и потоков включено, чтобы я мог отправлять им события SIPI. Я также хочу, чтобы каждый поток знал, какой это поток.

Например, в одноядерной конфигурации с включенным HT мы имеем (например, Intel Atom):

thread 0 --> core 0 thread 0
thread 1 --> core 0 thread 1

В двухъядерной конфигурации без HT мы имеем (например, Core 2 Duo):

thread 0 --> core 0 thread 0
thread 1 --> core 1 thread 0

Какой лучший способ определить это?

Редактировать: Я нашел, как каждый поток может найти, какой это поток. Я до сих пор не нашел, как определить количество ядер.

1 Ответ

7 голосов
/ 26 апреля 2009

Я немного исследовал это и придумал эти факты. cpuid с eax = 01h возвращает идентификатор APIC в EBX[31:24] и разрешение HT в EDX[28].

Этот код должен выполнять работу:

    ; this code will put the thread id into ecx
    ; and the core id into ebx

    mov eax, 01h
    cpuid
    ; get APIC ID from EBX[31:24]
    shr ebx, 24
    and ebx, 0ffh; not really necessary but makes the code nice

    ; get HT enable bit from EDX[28]
    test edx, 010000000h
    jz ht_off

    ; HT is on
    ; bit 0 of EBX is the thread
    ; bits 7:1 are the core
    mov ecx, ebx
    and ecx, 01h
    shr ebx, 1

    jmp done

ht_off:
    ; the thread is always 0
    xor ecx, ecx

done:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...