Этот вопрос задает вопрос о том, чтобы два процесса работали на одном и том же процессоре. Используя 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
на физические ядра?