Как вы контролируете схожесть потоков между несколькими процессами в Linux?
Вопрос
Как мне запустить два теста так, чтобы:
- Они оба исполняются одновременно
- Оба теста имеют половину своих потоков на каждом сокете.
- Нет двух потоков с одним и тем же ядром.
Фон
У меня есть две программы: бенчмарк, написанный на Fortran, и бенчмарк, написанный на C. Они оба реализуют библиотеку OpenMP и настроены на.
В настоящее время я пытаюсь распределить потоки обоих процессов по нескольким сокетам, не позволяя двум потокам совместно использовать одно и то же ядро. OpenMP позволяет равномерно распределять потоки по нескольким сокетам, используя OMP_PROC_BIND=spread
переменная окружения. Однако при одновременном выполнении обеих программ я получаю оба эталонных теста с одинаковыми ядрами.
Я выполняю эти тесты на сервере с двумя 12-ядерными процессорами Haswell-E, и у меня установлены тесты для создания 12 потоков в одной части, так что нет недостатка в ядрах. В настоящее время я использую CentOS 7.3.1611.
Примечание
Я знаю, что это странная конфигурация, однако она необходима для анализа производительности. Заранее большое спасибо всем, кто внес свой вклад в эту тему.
1 ответ
Во-первых: получите ваш макет процессора из /proc/cpuinfo, который будет выглядеть примерно так (это на 2-сокетном, 6-ядерном, список урезан):
> cat /proc/cpuinfo |grep -P 'processor|physical id|core id'
processor : 0
physical id : 1
core id : 0
processor : 1
physical id : 0
core id : 0
processor : 2
physical id : 1
core id : 1
processor : 3
physical id : 0
core id : 1
физический идентификатор будет вашим сокетом, обратите внимание, в моем случае переключение основного идентификатора между сокетами.
используйте 'schedtool', чтобы установить сродство 1 группы ко всем физическим идентификаторам. Так что в моем случае, так как четы и шансы находятся на отдельных физических процессорах (сокетах), я бы использовал:
schedtool -a 0,2,4,6,8,10 -e run_group1 &
schedtool -a 1,3,5,7,9,11 -e run_group2 &
где run_group1 запускает все ваши потоки на одном ядре, а run_group2 запускает остальные. (посмотрите на 'man schedtool' (в разделе 8, чтобы узнать больше вариантов. Я поместил их оба в фоновый режим, чтобы обе группы работали одновременно).
Возможно, вам нужно быть пользователем root, чтобы установить сходство - не уверен.
Это решает ваш вопрос или я что-то неправильно понял?