можно найти --physcpubind
Я использовал numactl, с опцией --physcpubind. инструкция гласит:
--physcpubind=cpus, -C cpus
Only execute process on cpus. Etc...
Предположим, у меня есть система NUMA с 3 узлами NUMA, где каждый из них имеет 4 ядра. Узел NUMA 0 имеет 0, 1, 2, 3 в качестве основных чисел. Узел NUMA 1 имеет 4,5,6,7, а узел NUMA 2-8,9,10,11. Мой вопрос таков: допустим, я запускаю программу следующим образом:
export OMP_NUM_THREADS=6
numactl --physcpubind=0,1,4,5,8,9 ./program
То есть я буду запускать свою программу с 6 потоками, и я прошу их быть на ядрах процессора 0,1,4,5,8,9. Например, если в какой-то момент во время выполнения программы потоки 0-5 назначаются ядрам процессора 0,1,4,5,8,9 (setup1). Возможно ли, что в какой-то другой момент во время выполнения программы поток 0 может работать на ядре процессора 9, например, и так далее? Т. е. будет ли происходить миграция потоков между ядрами процессора? Или потоки однозначно привязываются к ядрам процессора (как в setup1)? Спасибо.
1 ответ:
Physcpubind опцияnumactl должна быть интерфейсом к системному вызовуsched_setaffinity , который изменяет cpuset (набор разрешенных CPU) процесса в момент запуска процесса. Каждый поток будет иметь собственный набор процессоров, но все потоки унаследуют свое значение набора процессоров от родительского процесса.
Таким образом, потоки могут выполняться на любом процессоре из набора процессоров, миграция разрешена между любым процессором из набора процессоров.
Любой поток может вызвать sched_setaffinity или pthread_setaffinity_np (специфичный для linux вариант изменения аффинности для одного потока), чтобы сузить или даже расширить свой cpuset.
, Если вы хотите привязать нитки к ЦП, использовать sched_setaffinity или pthread_setaffinity_np непосредственно в каждую нить, или, в случае с OpenMP установить родство через ОМП библиотека: OpenMP и процессор сродство например, с помощью команды (в OpenMP 3.1+)
export OMP_PROC_BIND=true
Я предполагаю, что библиотека OMP будет выбирать процессоры в циклическом порядке из набора процессоров процесса в момент инициализация библиотеки omp.
Для более старой версии библиотеки поддержки libgomp-OMP, используемой GCC - вы можете передать разрешенный набор CPU с помощью команды:
export GOMP_CPU_AFFINITY=0-1,4-5,8-9
PS: чтобы проверить размещение потоков, вы можете запустить
top
и включить поле "последний используемый процессор" с помощьюf
j
клавиши и включить отображение потока с помощьюH
.