#c #multithreading #c 11 #numa
#c #многопоточность #c 11 #numa
Вопрос:
В Windows, как я могу:
- запросите, сколько узлов NUMA в системе
- установить привязку std::thread к ядрам процессора определенного узла NUMA?
Комментарии:
1. Итак, никто не отвечает на вопрос? Что здесь происходит?
Ответ №1:
Чтобы получить индекс самого высокого узла:
auto highestnode = 0UL;
GetNumaHighestNodeNumber(amp;highestnode);
Чтобы получить привязку всех логических ядер на узле для общего количества логических ядер до 64:
auto mask = 0ULL;
GetNumaNodeProcessorMask(nodeindex, amp;mask);
Чтобы установить привязку потока:
SetThreadAffinityMask(GetCurrentThread(), mask);
Или для общего количества логических ядер более 64:
auto node = static_cast<PGROUP_AFFINITY>(malloc(sizeof(PGROUP_AFFINITY)));;
GetNumaNodeProcessorMaskEx(nodeindex, node);
Где маска для узла — это узлы-> Маска.
Большие узлы с более чем 64 логическими ядрами будут разделены на группы, указанные в nodes->Group.