Я пытаюсь распределить данные между несколькими рабочими процессами с помощью OpenMPI, однако я делаю разделение данных довольно нестандартным способом, который не поддается MPI_Scatter
или MPI_Broadcast
. Что я хотел бы сделать, так это дать каждому процессору некоторую работу в очереди (или каком-либо другом асинхронном механизме), чтобы они могли выполнять свою работу с первым фрагментом данных, брать следующий фрагмент, повторять, пока фрагменты не исчезнут.
Я знаю о MPI_Isend
, однако, если я отправляю данные с помощью MPI_Isend
, я не могу изменить их, пока они не закончат отправку; вынуждает меня использовать MPI_Wait
и, таким образом, все равно ждать, пока поток закончит получать данные!
Есть ли стандартное решение этой проблемы, или я должен переосмыслить свой подход?
1 ответ
Использование MPI_ISEND
не обязательно означает, что сообщение получено на удаленном конце. Это просто означает, что буфер доступен для повторного использования. Может случиться так, что сообщение было внутренне буферизовано Open MPI или что сообщение действительно было получено на другом конце. Это зависит от размера вашего сообщения.
Другой вариант - попросить ваших работников попросить главный процесс о работе, когда она им нужна, вместо того, чтобы отправлять ее им. Тогда мастер сможет работать только по мере надобности. Вы можете сделать MPI_SCATTER
для первого сообщения, так как все будут получать какие-то данные. Затем, после этого, пусть мастер выполнит MPI_RECV(MPI_ANY_SOURCE)
, чтобы получить сообщение от одного из рабочих процессов.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
WAIT
вISEND
вернется после внутренней буферизации данных, вместо того, чтобы ждать, пока клиент получит данные? Тогда это может быть то, что я хочу, поскольку это должно неявно помещать данные в очередь. ИдеяMPI_RECV(MPI_ANY_SOURCE)
хороша, но она делегирует мастеру только разделение данных, а не сопоставление результатов уже завершенных операций, не так ли?MPI_IRECV
сMPI_WAITANY
, либо вы можете объединить их и просто заставить мастер автоматически отправлять обратно работу после получения результатов.