This question просит об обеспечении двух процессов, выполняющихся на одном CPU. Использование sched_setaffinity
Я могу ограничить процесс несколькими логическими процессорами, но как я могу обеспечить их сопоставление с конкретными физическими процессорами и потоками?Как я могу гарантировать, что процесс выполняется в определенном физическом ядре процессора и потоке?
Я ожидал, что отображение будет:
0 - CPU 0 0 нити
1 - ЦПУ 0 нить 1
2 - процессор 1 нить 0
3 - процессор 1 поток 1
т.д. ..
где число слева - это соответствующий CPU, используемый в 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
для физических ядер?
. Одна из лучших функций hwloc - это возможность показать диаграмму топологии системы - как распределяются кэши процессоров, домены памяти и т. Д. –