2012-02-21 3 views
3

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 для физических ядер?

ответ

2

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

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

+0

. Одна из лучших функций hwloc - это возможность показать диаграмму топологии системы - как распределяются кэши процессоров, домены памяти и т. Д. –