MPI_Lock_win / путаница в использовании пассивной синхронизации - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь преобразовать приложение из стандартных двухточечных вызовов MPI (например, MPI_Isend, MPI_Irecv) в односторонние вызовы MPI-3. Моя цель - повысить производительность моего оборудования, которое представляет собой систему с аппаратной поддержкой Infiniband и реализацией MPI, оптимизированной для вызовов RDMA. Мне сказали, что оборудование работает особенно хорошо в режиме пассивной синхронизации, в отличие от активной синхронизации (т. Е. Post-Start-Complete-Wait ).

Однако даже после чтения из-за стандартной документации MPI и примеров я запутался в том, как на самом деле использовать вызовы. Для контекста, моя программа имеет фазу установки, на которой я буду знать схему связи и даже буферы отправляемых данных и конечный буфер получателя. Таким образом, просто настроить окно и использовать его.

В частности, с пассивной синхронизацией я запутался, когда «получатель» знает, что данные в окне были записаны отправителем. Я хочу, чтобы отправитель создал данные сообщения, затем вызвал MPI_Win_lock в окне, затем набрал MPI_Put и затем дождался завершения с MPI_Win_Unlock. Но какой эффективный / рекомендуемый способ для «получателя» (оконной цели) данных знать, когда были записаны данные сообщения? Точно так же, учитывая, что шаблон связи повторяется и один и тот же приемный буфер (целевой буфер) используется несколько раз, как мне узнать, что приемник завершил использование буфера и его можно использовать повторно?

Могу ли я Представьте пару подходов:

  1. Я могу использовать MPI_Barrier после MPI_Win_unlock и до того, как получатель получит доступ к данным. (Кажется, это будет работать, но я скептически отношусь к тому, что это даст лучшую производительность, чем активная синхронизация.)

  2. Возможно, я могу использовать MPI_Lock и MPI_Unlock на приемнике (цель), блокируя окно, когда цель на самом деле использует данные, поэтому эпоха доступа не может начаться с начала координат (но так ли это работает? Я читал, что блокировка и разблокировка не создают критические секции в традиционном смысле) ,

  3. Какой-то доморощенный подход, при котором получатель запрашивает какой-то одноразовый номер для записи, зная, что данные доступны, когда это произойдет.

Документы для MPI_Win_lock: https://www.open-mpi.org/doc/v3.0/man3/MPI_Win_lock.3.php

В общем, как программист синхронизируется с MPI_Lock и 'MPI_Unlock` таким образом, что это более эффективно, чем активный подход синхронизации? Такое ощущение, что мне нужно просто использовать post-start-complete-wait, но я надеюсь, что вы также поможете мне найти способ попробовать пассивную синхронизацию.

...