как установить привязку потока c 11 к узлу NUMA в Windows?

#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.