何时使用MPI\u缓冲区\u连接?

何时使用MPI\u缓冲区\u连接?,mpi,Mpi,据我所知,如果要进行缓冲通信,进程必须调用MPI_BUFFER_ATTACH。但这是否也包括标准的MPI_发送?我们知道MPI\u发送可以作为同步发送或缓冲发送。只有在计划通过MPI\u Bsend()执行(显式)缓冲发送时,才需要调用MPI\u Buffer\u attach() 如果只计划MPI\u发送()或MPI\u发送(),则不需要调用MPI\u缓冲区附加() FWIW,缓冲发送容易出错,我强烈建议您不要使用它们。MPI\u Buffer\u attach 附加用户提供的用于发送的缓冲区

据我所知,如果要进行缓冲通信,进程必须调用MPI_BUFFER_ATTACH。但这是否也包括标准的MPI_发送?我们知道MPI\u发送可以作为同步发送或缓冲发送。

只有在计划通过
MPI\u Bsend()
执行(显式)缓冲发送时,才需要调用
MPI\u Buffer\u attach()

如果只计划
MPI\u发送()
MPI\u发送()
,则不需要调用
MPI\u缓冲区附加()


FWIW,缓冲发送容易出错,我强烈建议您不要使用它们。

MPI\u Buffer\u attach

附加用户提供的用于发送的缓冲区

简介

int MPI\u缓冲区\u附加(无效*缓冲区,int大小)

输入参数

缓冲区 初始缓冲区地址(选择)

大小 缓冲区大小,以字节为单位(整数)

注释

给出的尺寸应为所有未清尺寸的总和 您想要的BSEND,加上每个BSEND的MPI\u BSEND\u开销 你就是这样。为了计算大小,您应该使用 MPI包装尺寸。换句话说,在代码中

MPI_Buffer_attach调用中的size值应大于

 MPI_Pack_size( 20, type1, comm, &s1 );
 MPI_Pack_size( 40, type2, comm, &s2 );
 size = s1 + s2 + 2 * MPI_BSEND_OVERHEAD;
MPI_BSEND_开销提供了缓冲区中可供BSEND例程在使用缓冲区时使用的最大空间量。此值的单位为mpi.h(对于C)和mpif.h(对于Fortran)。 线程和中断安全 用户负责确保多个线程不会尝试从不同线程更新同一个MPI对象。此例程不应从信号处理程序中使用

MPI标准定义了一个线程安全接口,但这并不意味着可以在没有任何线程锁的情况下调用所有例程。例如,两个线程不能同时尝试更改同一MPI_Info对象的内容。在这种情况下,用户负责使用一些机制,例如线程锁,以确保一次只有一个线程使用此例程。由于用于缓冲发送的缓冲区(例如,MPI_Bsend)由进程中的所有线程共享,因此用户负责确保一次只有一个线程调用此例程或MPI_buffer_detach

Fortran注释

Fortran中的所有MPI例程(MPI_WTIME和MPI_WTICK除外)在参数列表的末尾都有一个额外的参数ierr。ierr是一个整数,与C中例程的返回值具有相同的含义。在Fortran中,MPI例程是子例程,通过call语句调用。 所有MPI对象(例如,MPI_数据类型、MPI_通信)在Fortran中都是整数类型

错误

所有MPI例程(MPI_Wtime和MPI_Wtick除外)返回一个错误值;C例程作为函数的值,Fortran例程在最后一个参数中。在返回值之前,将调用当前的MPI错误处理程序。默认情况下,此错误处理程序中止MPI作业。错误处理程序可以使用MPI_Comm_set_errhandler(用于通讯器)、MPI_File_set_errhandler(用于文件)和MPI_Win_set_errhandler(用于RMA窗口)进行更改。可以使用MPI-1例程MPI\u Errhandler\u集,但不推荐使用它。预定义的错误处理程序MPI_ERRORS_RETURN可用于导致返回错误值。请注意,MPI不能保证MPI程序可以在错误之后继续运行;但是,MPI实现将尽可能继续

MPI\U成功

没有错误;MPI例程已成功完成

MPI错误缓冲区

缓冲区指针无效。通常是无效的空缓冲区

MPI错误实习生

检测到内部错误。这是致命的。请向mpi发送错误报告-bugs@mcs.anl.gov.

另请参见MPI\U缓冲区分离,MPI\U Bsend

有关更多信息,请参阅此处

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