Я пытаюсь распределить данные между несколькими рабочими процессами с помощью OpenMPI, однако я делаю разделение данных довольно нестандартным способом, который не поддается MPI_Scatter или MPI_Broadcast . Что я хотел бы сделать, так это дать каждому процессору некоторую работу в очереди (или каком-либо другом асинхронном механизме), чтобы они могли выполнять свою работу с первым фрагментом данных, брать следующий фрагмент, повторять, пока фрагменты не исчезнут.

Я знаю о MPI_Isend, однако, если я отправляю данные с помощью MPI_Isend, я не могу изменить их, пока они не закончат отправку; вынуждает меня использовать MPI_Wait и, таким образом, все равно ждать, пока поток закончит получать данные!

Есть ли стандартное решение этой проблемы, или я должен переосмыслить свой подход?

1
Ben Stott 7 Сен 2013 в 18:53

1 ответ

Лучший ответ

Использование MPI_ISEND не обязательно означает, что сообщение получено на удаленном конце. Это просто означает, что буфер доступен для повторного использования. Может случиться так, что сообщение было внутренне буферизовано Open MPI или что сообщение действительно было получено на другом конце. Это зависит от размера вашего сообщения.

Другой вариант - попросить ваших работников попросить главный процесс о работе, когда она им нужна, вместо того, чтобы отправлять ее им. Тогда мастер сможет работать только по мере надобности. Вы можете сделать MPI_SCATTER для первого сообщения, так как все будут получать какие-то данные. Затем, после этого, пусть мастер выполнит MPI_RECV(MPI_ANY_SOURCE), чтобы получить сообщение от одного из рабочих процессов.

1
Wesley Bland 8 Сен 2013 в 05:46
1
О, хорошо, значит, WAIT в ISEND вернется после внутренней буферизации данных, вместо того, чтобы ждать, пока клиент получит данные? Тогда это может быть то, что я хочу, поскольку это должно неявно помещать данные в очередь. Идея MPI_RECV(MPI_ANY_SOURCE) хороша, но она делегирует мастеру только разделение данных, а не сопоставление результатов уже завершенных операций, не так ли?
 – 
Ben Stott
8 Сен 2013 в 08:14
Неа. Вы можете использовать несколько тегов в своем «MPI_IRECV» для разделения типов сообщений. Если у вас есть сообщение с просьбой о работе, вы можете ответить соответствующим образом. Если у вас есть ответное сообщение с результатами, вы можете получить данные и продолжить. Просто используйте либо два вызова MPI_IRECV с MPI_WAITANY, либо вы можете объединить их и просто заставить мастер автоматически отправлять обратно работу после получения результатов.
 – 
Wesley Bland
8 Сен 2013 в 21:27
Замечательно, это похоже на то, что я хотел. Спасибо за помощь!
 – 
Ben Stott
9 Сен 2013 в 15:50