Как я могу гарантировать, что процесс выполняется в определенном физическом ядре процессора и потоке? - PullRequest
3 голосов
/ 22 февраля 2012

Этот вопрос задает вопрос о том, чтобы два процесса работали на одном и том же процессоре. Используя sched_setaffinity, я могу ограничить процесс количеством логических процессоров, но как я могу гарантировать, что они отображаются на конкретные физические процессоры и потоки?

Я ожидаю, что отображение будет:

0 - ЦП 0, поток 0
1 - ЦП 0, поток 1
2 - ЦП 1, поток 0
3 - ЦП 1, поток 1
и т.д ...

где число слева - соответствующий процессор, используемый в sched_setaffinity.

Однако, когда я попытался проверить это, оказалось, что это не обязательно так.

Чтобы проверить это, я использовал инструкцию CPUID, которая возвращает начальный идентификатор APIC текущего ядра в EBX:

void print_cpu() 
{
    int cpuid_out;

    __asm__(
    "cpuid;"
        : "=b"(cpuid_out) 
        : "a"(1) 
        :);

    std::cout << "I am running on cpu " << std::hex << (cpuid_out >> 24) << std::dec << std::endl;
}

Затем я перебрал биты в маске процессора и установил их по одному, чтобы ОС поочередно перенесла процесс на каждый логический процессор, а затем распечатал текущий процессор.

Вот что я получил:

cpu mask is 0 
I am running on cpu 0
cpu mask is 1 
I am running on cpu 4
cpu mask is 2 
I am running on cpu 2
cpu mask is 3 
I am running on cpu 6
cpu mask is 4 
I am running on cpu 1
cpu mask is 5 
I am running on cpu 5
cpu mask is 6 
I am running on cpu 3
cpu mask is 7 
I am running on cpu 7

при условии, что ЦП назначает начальные идентификаторы APIC в соответствии со схемой, которую я перечислил выше, может показаться, что маска ЦП фактически не соответствует физическому ядру и потоку.

Как найти правильное отображение битов в маске для sched_setaffinity на физические ядра?

1 Ответ

2 голосов
/ 22 февраля 2012

hwloc - это переносимая библиотека C для обнаружения топологии оборудования / NUMA, а также для привязки процессов / потоков к определенным ядрам. Он имеет функции для обнаружения физических / логических ядер, а затем связывает с ним процесс / поток.

Он также выглядит как и может возвращать cpu_set_t для использования с sched_setaffinity(), если вы хотите продолжать использовать это напрямую.

...