2015-09-30 1 views
0

Я работаю с MPI, и у меня есть определенная иерархия операций. Для конкретного значения параметра _param я запускаю 10 проб, каждый из которых запускает определенный процесс на отдельном ядре. Для значений п _param, код выполняется в определенной иерархии, как:Вычисление использования независимых ядер и привязка процесса к ядру

driver_file -> запускает один процесс, который проверяет, если имеющиеся процессы более чем 10. Если более чем 10 доступны, то он запускает экземпляр процесс с определенным значением _param передается в качестве аргумента в coupling_file

coupling_file -> делает некоторые элементарные вычисления, а затем запускает 10 процессов с использованием MPI_Comm_spawn(), каждый из которых соответствует trial_file при прохождении _trial в качестве аргумента

trial_fil е -> вычисляет работу, возвращает значения в coupling_file

Я перед двумя дилеммами, а именно:

  1. Как определить необходимое условие для ядер в driver_file? Как и в том, как узнать, сколько процессов было завершено, чтобы я мог правильно планировать процессы на незанятых ядрах? Я подумал, может быть, добавить блокировку MPI_Recv() и использовать его для передачи переменной, которая сообщила бы мне, когда какой-то процесс будет завершен, но я не уверен, что это лучшее решение.

  2. Как обеспечить соответствие процессов различным ядрам? Я подумал об использовании чего-то вроде mpiexec --bind-to-core --bycore -n 1 coupling_file, чтобы запустить один файл связи. За этим последует что-то вроде mpiexec --bind-to-core --bycore -n 10 trial_file , запущенное сообщением connection_file. Однако, если я привязываю процессы к ядру, я не хочу, чтобы одно и то же ядро ​​имело два и более процессов. Как и в, я не хочу _trial_1_coupling_1 для запуска на ядре x, затем запускаю еще один процесс coupling_2, который запускает _trial_2, который также привязывается к ядру x.

Любой ввод будет оценен. Благодаря!

+0

Как вы хотите фиксированное количество процессов, почему бы не начать их с mpiexec, а затем просто раздавать задания им? Возможно, вам придется добавить некоторую логику обработки клиент-сервер, но вы избавитесь от нереста, и все процессы могут быть надлежащим образом закреплены. – haraldkl

ответ

0

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

  • Используйте один мастер (ранг 0)
  • Partition остальной в группы из 10 процессов, может создать новый коммуникатор для каждой группы, если это необходимо, каждая группа имеет один ведущий процесс, известный мастеру.

В своем коде вы затем можете сделать что-то вроде:

if master: 
    send a specific _param to each group leader (with a non-blocking send) 
    loop over all your different _params 
     use MPI_Waitany or MPI_Waitsome to find groups that are ready 
else 
    if groupleader: 
     loop endlessly 
      MPI_Recv _params from master 
      coupling_file 
      MPI_Bcast to group 
      process trial_file 
    else 
     loop endlessly 
      MPI_BCast (get data from groupleader) 
      process trial file 

Я думаю, после этого подхода позволит вам решить обе ваши проблемы. Доступность групп процессов обнаруживается с помощью MPI_Wait *, хотя вам может понадобиться изменить вышеприведенную логику, чтобы уведомить мастера в конце вашей задачи, чтобы он отправлял только новые данные, а еще не во время предыдущего испытания все еще работает, а другой группа процессов может быть быстрее.И фиксация разрешена, поскольку у вас есть фиксированное количество процессов, которые могут быть правильно закреплены во время обычного запуска.

+0

вы можете предложить любой способ запланировать процессы MPI, чтобы один процесс выполнял только одно ядро ​​только во время работы, когда нет. процессов больше, чем количество ядер? Я хочу, чтобы один процесс работал на одном ядре, заканчивался сам, а затем выполнялся другой процесс вместо двух процессов, работающих на одном ядре, и переключения контекстов между ними. и спасибо за ваше решение! – micawber

+0

@micawber Извините, никогда не работал с нерестами и заканчивал процессы динамически, поэтому я действительно не знаю. Способ, которым я пользуюсь MPI, заключается в том, чтобы запустить фиксированное количество процессов, которое соответствует количеству ядер, а затем работать внутри них, возможно, с разными ролями. Возможно, у кого-то есть ответ на это. – haraldkl