2015-05-13 2 views
0

У меня проблемы с OpenMPI, где разные ряды MPI постоянно связаны с одними и теми же ядрами ЦП.OpenMPI и привязки ранга/ядра

Я использую сервер с 32 аппаратными ядрами (без гиперпотоков), Ubuntu 14.04.2 LTS и OpenMPI 1.8.4, скомпилированные с помощью компилятора Intel 15.0.1.

Например, я могу запустить мой исполняемый файл с 8 MPI рангах, и получить следующий ранг основных привязок,

$ mpirun -n 8 --report-bindings ./executable 
[simple:16778] MCW rank 4 bound to socket 0[core 1[hwt 0]]: [./B/./././././.][./././././././.][./././././././.][./././././././.] 
[simple:16778] MCW rank 5 bound to socket 1[core 9[hwt 0]]: [./././././././.][./B/./././././.][./././././././.][./././././././.] 
[simple:16778] MCW rank 6 bound to socket 2[core 17[hwt 0]]: [./././././././.][./././././././.][./B/./././././.][./././././././.] 
[simple:16778] MCW rank 7 bound to socket 3[core 25[hwt 0]]: [./././././././.][./././././././.][./././././././.][./B/./././././.] 
[simple:16778] MCW rank 0 bound to socket 0[core 0[hwt 0]]: [B/././././././.][./././././././.][./././././././.][./././././././.] 
[simple:16778] MCW rank 1 bound to socket 1[core 8[hwt 0]]: [./././././././.][B/././././././.][./././././././.][./././././././.] 
[simple:16778] MCW rank 2 bound to socket 2[core 16[hwt 0]]: [./././././././.][./././././././.][B/././././././.][./././././././.] 
[simple:16778] MCW rank 3 bound to socket 3[core 24[hwt 0]]: [./././././././.][./././././././.][./././././././.][B/././././././.] 

, который работает, как ожидалось.

Проблема в том, что если я запустил эту команду во второй раз (выполняя прогон в другой папке), я снова получаю точно такие же привязки. Это означает, что из 32 ядер процессора 8 будут иметь нагрузку дважды, а остальные 24 ничего не сделают.

Я отдаю себе отчет в другом options от mpirun связать ядром, розетки и т.д. Я мог бы, например, указать в явном виде ядра, которые должны быть использованы с --cpu-set аргументом, или в более общем плане существует ранжирование политики,

- ставка по рейтингам [слот (по умолчанию) | hwthread | ядро | разъем | numa | доска | узел]

Вместо этого я ищу способ автоматически распределять нагрузку на ядра ЦП, которые являются бесплатными, а не повторно использовать одни и те же ядра дважды. Есть ли какая-то политика, которая контролирует это?

+1

Если вы уверены, что такое поведение является специфическим для машины, а затем, возможно, ваш администратор системы может помочь. В противном случае, вместо прямого вызова 'mpirun', вы можете попробовать написать сценарий оболочки, который обнаруживает ядра, не запускающие вашу программу, и соответственно вызывает« mpirun ». – suszterpatt

+1

У экземпляра 'mpirun' нет способа узнать, какие ядра используются другим. Вот почему такие вещи, как распределенные менеджеры ресурсов (DRM, также называемые системами периодического обслуживания), существуют. При правильной настройке DRM, которые понимают топологии узлов, обычно могут предоставлять необходимую информацию библиотеке MPI и тем самым препятствовать связыванию двух заданий MPI с одним и тем же набором ядер. –

+0

@HristoIliev Спасибо за ваш ответ, что делает чувство. Но предположим, что мы не хотим настраивать систему очередей (это всего лишь один узел, поэтому на самом деле это не стоит). Как насчет использования '--bind-to none' и позволяя ядру Linux распределять нагрузку между различными ядрами ЦП, как и для обычных процессов. Является ли это плохой практикой в ​​HPC? – rth

ответ

1

Выполняете ли вы одновременно исполняемые файлы? Если не поведение вашей системы кажется вполне логичным. Если вы хотите запустить два экземпляра в то же время и убедитесь, что они работают на разных ядрах вы можете попробовать что-то вроде этого:

numactl physcpubind=0-7 mpirun -n 8 --report-bindings ./executable & 

numactl pyscpubind=8-31 mpirun -n 24 --report-bindings ./executable 
+0

Хорошая альтернатива установке '--cpu-set 0,1,2,3,4,5,6,7' и т. Д. Явно, спасибо. – rth