2017-01-25 4 views
0

У меня есть два процесса p0 и p1. Один из процессов делает вещи на массиве (я не знаю, какой процесс). Последний, другой процесс должен сделать некоторые вещи (в массиве обновлений). Пример:Обновление массива между процессами MPI

  • p1 делает материал на массиве
  • p1 «отправить» массив
  • ро должны работать на массив -> «читать» массив обновления
  • p1 нужно работать массив -> «читать» блок обновления

... и так далее. Похоже, мне нужно использовать MPI BSEND, но я увидел, что есть также MPI SENDRECV. В случае использования MPI BSEND, как процесс узнает, что что-то было помещено в буфер?

Благодаря

ответ

0

Итак, что вы говорите, что у вас есть массив A, который существует на P1. После этого на первом этапе вычисляются оба P0 и P1 независимо друг от друга с массивом, который был вычислен на первом этапе.

На самом деле это далеко, чтобы быть достаточно информации.

  • Если вычисление А на первом этапе мало (меньше, чем величина связи), или если Р0 не занят в то время как Р1 вычисляет, можно вычислить ОНД оба процессора независимо друг от друга.
  • Вычисление на втором этапе должно быть достаточно большим, чтобы отправить данные другому процессору.
  • Если оба вычисления на P0 и P1 имеют примерно одинаковый размер, вы можете просто использовать MPI_Send (блокирование), потому что я ожидаю другую точку синхронизации позже.
  • Я бы предпочел вручную скопировать массив (только ту часть, которая действительно нужна) и использовать асинхронные вызовы MPI (Isend/Irecv) против MPI_Bsend, что не рекомендуется.
  • Вы должны использовать только Bsend, Ssend и другие варианты, если есть веские основания. Это очень зависит от реализации и сети, которая лучше всего подходит для вызовов. Вы должны решить, можете ли вы использовать async MPI или нет. Только подумайте о других вызовах MPI, если это действительно необходимо.

Но какой смысл использовать MPI_Sendrecv для этой проблемы? Это полезно, когда p0 sneed что-то p1 и в той же точке p1 отправляет что-то в p0. Но это не то, что вы описываете, так что это наверняка неправильная функция, и именно поэтому я рекомендую вам начать с MPI_Send.