Есть ли пример использования mbind в коде C / C ++?

Я пытаюсь использовать 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,

3

Решение

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,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]