MPI - отправка и получение строк матрицы - PullRequest
1 голос
/ 03 апреля 2011

Я делаю программу, где будет 2-4 процесса в MPI с языком Си.В исключении я посылаю каждую строку ниже фактической строки различным процессам с помощью циклического отображения.

например, для матрицы 5 * 6, когда есть активная строка 0, и 4 процесса, я посылаю строку 1 в процесс 1,строка 2 для процесса 2, строка 3 для процесса 3 и строка 4 для процесса 1 снова.В этих процессах я хочу сделать некоторые вычисления и вернуть некоторые значения обратно процессу 0, который добавит их в исходную матрицу.У меня вопрос, какой вызов Send и Recv я должен использовать?

Есть некоторый теоретический код:

if(master){

  for(...)
  //sending values to other processes
  }

  for(...)
  //recieving values from other processes
  }
}else{//for other non-master processes
  recieve value from master
  doing some computing
  sending value back to master

}

Если я использую только простую блокировку отправки, я не знаю, что произойдетв процессе 1, потому что он получает строки 1 и 4, и прежде чем я вызову recv в master, мое значение в процессе 1 - строка 1 будет перезаписано строкой 4, поэтому я пропущу один набор данных, я прав?Мой вопрос по поводу того, какой MPI_Send я должен использовать?

1 Ответ

0 голосов
/ 03 апреля 2011

Возможно, вы сможете использовать неблокирование, если, скажем, proc 1 может начать что-то делать со строкой 1, ожидая строки 4. Но блокировка также должна начинаться с нуля.

Существуетмного синхронизации встроено в алгоритм.Каждый должен работать на основе текущей строки.Таким образом, процессы получения должны знать, сколько работы ожидать для каждой итерации этой процедуры.Это легко сделать, если они знают общее количество строк и над какой итерацией они сейчас работают.Поэтому, если они ожидают две строки, они могут сделать две блокирующие записи или запустить две неблокирующие записи, подождать одну и сразу начать обработку первой строки.Но, пожалуй, проще всего сначала заставить блокировку работать.

Даже в самом начале может оказаться полезным, чтобы основной процесс выполнял операции завершения, чтобы все посылки можно было «запускать» одновременно;тогда стойка ожидания может обработать их в любом порядке.

Но лучше, чем это общение «один ко многим», вероятно, будет использовать scatterv, который можно ожидать более эффективным.

Что-тоэто поднималось во многих ответах и ​​комментариях к этой серии вопросов, но я не думаю, что вы когда-либо обращались к ним - я действительно надеюсь, что вы просто работаете над этим проектом в образовательных целях.Было бы совершенно безумно внедрять собственные решатели параллельной линейной алгебры, когда есть настроенные и протестированные инструменты, такие как Scalapack , PETSc и Plapack там бесплатно для скачивания.

...