Когда использовать MPI_BUFFER_ATTACH? - PullRequest
1 голос
/ 26 сентября 2019

Насколько я знаю, MPI_BUFFER_ATTACH должен вызываться процессом, если он собирается осуществлять буферизованную связь.Но включает ли он также стандарт MPI_SEND?Мы знаем, что MPI_SEND может вести себя как синхронная передача или как буферизованная передача.

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Вам необходимо звонить MPI_Buffer_attach() только в том случае, если вы планируете (явно) буферизованные посылки через MPI_Bsend().

Если вы планируете только MPI_Send() или MPI_Isend(), то вам не нужночтобы вызвать MPI_Buffer_attach().

FWIW, буферизованные посылки подвержены ошибкам, и я настоятельно рекомендую вам не использовать их.

0 голосов
/ 26 сентября 2019

MPI_Buffer_attach

Присоединяет предоставленный пользователем буфер для отправки

Сводка

int MPI_Buffer_attach (void * buffer,int size)

Входные параметры

буфер начальный адрес буфера (выбор)

размер размер буфера, в байтах (целое число))

Примечания

Указанный размер должен быть суммой размеров всех ожидающих Bsends, которые вы намереваетесь иметь, плюс MPI_BSEND_OVERHEAD для каждого Bsend, который выделать.Для расчета размера вы должны использовать MPI_Pack_size.Другими словами, в коде

 MPI_Buffer_attach( buffer, size );
 MPI_Bsend( ..., count=20, datatype=type1,  ... );
 ...
 MPI_Bsend( ..., count=40, datatype=type2, ... );

значение размера в вызове MPI_Buffer_attach должно быть больше, чем значение, вычисленное как

 MPI_Pack_size( 20, type1, comm, &s1 );
 MPI_Pack_size( 40, type2, comm, &s2 );
 size = s1 + s2 + 2 * MPI_BSEND_OVERHEAD;

MPI_BSEND_OVERHEAD дает максимальную суммупространства, которое может использоваться в буфере для использования подпрограммами BSEND при использовании буфера.Это значение находится в mpi.h (для C) и mpif.h (для Fortran).Безопасность потоков и прерываний Пользователь несет ответственность за то, чтобы несколько потоков не пытались обновить один и тот же объект MPI из разных потоков.Эту подпрограмму не следует использовать из обработчика сигнала.

Стандарт MPI определяет потокобезопасный интерфейс, но это не означает, что все подпрограммы могут быть вызваны без каких-либо блокировок потока.Например, два потока не должны пытаться изменить содержимое одного и того же объекта MPI_Info одновременно.В этом случае пользователь несет ответственность за использование какого-либо механизма, такого как блокировки потоков, чтобы гарантировать, что только один поток одновременно использует эту процедуру.Поскольку буфер для буферизованных отправок (например, MPI_Bsend) является общим для всех потоков процесса, пользователь несет ответственность за то, чтобы только один поток одновременно вызывал эту подпрограмму или MPI_Buffer_detach.

Примечания дляFortran

Все подпрограммы MPI в Фортране (кроме MPI_WTIME и MPI_WTICK) имеют дополнительный аргумент ierr в конце списка аргументов.ierr является целым числом и имеет то же значение, что и возвращаемое значение подпрограммы в C. В Fortran подпрограммы MPI являются подпрограммами и вызываются с помощью оператора call.Все объекты MPI (например, MPI_Datatype, MPI_Comm) имеют тип INTEGER в Фортране.

Ошибки

Все подпрограммы MPI (кроме MPI_Wtime и MPI_Wtick) возвращают значение ошибки;Подпрограммы на Си как значение функции и процедуры на Фортране в последнем аргументе.Перед возвращением значения вызывается текущий обработчик ошибок MPI.По умолчанию этот обработчик ошибок прерывает работу MPI.Обработчик ошибок может быть изменен с помощью MPI_Comm_set_errhandler (для коммуникаторов), MPI_File_set_errhandler (для файлов) и MPI_Win_set_errhandler (для окон RMA).Может использоваться подпрограмма MPI-1 MPI_Errhandler_set, но ее использование не рекомендуется.Предопределенный обработчик ошибок MPI_ERRORS_RETURN может использоваться для возврата значений ошибок.Обратите внимание, что MPI не гарантирует, что программа MPI может продолжить работу после ошибки;однако реализации MPI будут пытаться продолжить, когда это возможно.

MPI_SUCCESS

Без ошибок;Процедура MPI выполнена успешно.

MPI_ERR_BUFFER

Недопустимый указатель буфера.Обычно это пустой буфер, где он недопустим.

MPI_ERR_INTERN

Обнаружена внутренняя ошибка.Это смертельно.Пожалуйста, отправьте сообщение об ошибке по адресу mpi-bugs@mcs.anl.gov.

См. Также MPI_Buffer_detach, MPI_Bsend

Подробнее см.

Распределение и использование буфера

Программирование с MPI

MPI - использование Bsend

...