Я пытаюсь использовать mbind () в моем коде C ++ для перестановки виртуальных страниц в 4 доменах NUMA, к сожалению, я новичок в этой функции:
long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask,
unsigned long maxnode, unsigned flags);
В настоящее время у меня есть что-то вроде этого:
mbind(0x0,4611686018424767488,MPOL_BIND,nodemask,maxnode,MPOL_MF_MOVE);
Из спецификаций мне до сих пор неясно, что ставить и как ставить для nodemask
а также maxnode
,
nodemask
является указателем на битовую маску разрешенных узлов NUMA. Битовая маска представляет собой массив unsigned long
элементы с каждым элементом массива, содержащим столько битов, сколько размер unsigned long int
на конкретной архитектуре позволяет. Если ваша программа не работает в действительно большой системе NUMA, unsigned long
переменной должно хватить.
maxnode
дает количество значащих бит в nodemask
, Ядро внутренне округляет размер до кратного sizeof(unsigned long)
но использует только maxnode
биты.
Есть много примеров и библиотек, которые позволяют вам создавать и удобно манипулировать битовыми масками без необходимости самим манипулировать битовыми операциями. Вы можете использовать libnuma
, Это не позволяет вам установить MPOL_MF_MOVE
политика, но включает в себя функции для создания и манипулирования масками узлов.
Ужасный и очень непереносимый pro-tip для Linux Существующие макросы, которые имеют дело с масками привязки процессора, а именно CPU_ZERO
/ CPU_SET
/ CPU_CLR
и связанная структура данных cpu_set_t
также может использоваться для масок узлов NUMA. Причина в том, что (1) оба реализованы как массивы unsigned long
и (2) обычно меньше узлов NUMA, чем логических процессоров, поэтому cpu_set_t
должно иметь достаточно битов для представления всех узлов NUMA в системе.
Примечание: 4611686018424767488
должно быть, с суффиксом LL
,
Других решений пока нет …