⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpi72.htm

📁 该文件为mpich2的开发文档
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
   <TITLE> ICPSEP Content
</TITLE>
   <META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (Win95; I) [Netscape]">
</HEAD>
<BODY BGCOLOR="#F0F8FF">

<TABLE WIDTH="100%" >
<TR>
<TD align=left>
<H2>7.2 错误处理</H2>
</TD>

<TD align=right><A HREF="mpi71.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi71.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A>
<A HREF="mpi73.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi73.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A></TD>
</TR>
</TABLE>

<P>
<HR WIDTH="100%"></P>

<P>一个MPI实现不能或可以不选择处理一些MPI调用过程中的错误。这些包括产生异常或自陷的错误,例如浮点溢出或访问异常。由MPI处理的错误集是依赖于实现的。每一这样的错误产生一个MPI异常。
</P>

<P>用户可以将错误句柄同通信子相联系。被说明的错误处理进程将用于任何MPI异常,此异常是在调用MPI以同这个通信子通讯期间发生的。将任何通信子不相关的MPI调用考虑成与通信子MPI_COMM_WORLD相联系。将错误句柄与通信子相联系是纯局部的:不同的进程可以将不同的句柄联系到同一通信子上。</P>

<P>一个新创建的通信子继承了与其“父亲”通信子相联系的错误句柄。尤其是,用户可以通过初始化后,立即将句柄与MPI_COMM_WORLD相连,来说明用于所有通信子的“全局”句柄。
</P>

<P>在MPI中可以得到几个预定义的错误句柄: </P>

<P>MPI_ERRORS_ARE_FATAL 当调用时,此句柄引起程序退出所有的执行进程。如果嵌入到句柄中的进程调用MPI_ABORT,将产生同样的效果。</P>

<P>MPI_ERRORS_RETURN 该句柄没有作用</P>

<P>具体实现可以提供附加的预定义错误句柄,并且程序员可对自己的错误句柄编程。</P>

<P>错误句柄MPI_ERRORS_ARE_FATAL在初始化后,缺省与MPI_COMM_WORLD相连。所以,如果用户不选择控制错误句柄,那么由MPI处理的每一错误句柄都认为是致命的。由于所有的MPI调用都返回错误码,用户可以通过测试MPI调用的返回码,以及在调用不成功时执行以适当的恢复代码,来选择在主代码中处理错误。在这种情况,将使用错误句柄MPI_ERRORS_RETURN。通常在每一MPI调用后,不测试错误是更方便和有效的,并且由一个非繁琐的MPI错误句柄来处理这种错误。
</P>

<P>在检测到一个错误后,MPI状态没定义。 即,通过使用用户定义的错误句柄,或用MPI_ERRORS_RETURN,在检测到一个错误时,没有必要允许用户继续使用MPI。这些错误句柄意在允许一个用户发布用户定义的错误消息,以及在程序退出前采取与MPI不相关的动作(例如刷新I/O缓冲区)。一个MPI实现可以在错误后自由的允许MPI继续,但不要求这么做。
</P>

<UL>
<P>建议用户:一个高质量的实现最大可能、程度,限制错误的影响,以至于在嵌入一个错误句柄后正常处理可以继续。实现文档将提供可能的每类错误影响的信息。(建议用户结束)</P>
</UL>

<P>MPI错误句柄是一个不透明目标,可以被一个句柄访问。MPI用来创建新的错误句柄,将错误句柄同通信子相联系,以及测试哪一个错误句柄与通信子相联系。</P>

<P>MPI_ERRHANDLER_CREATE ( function, errhandler)</P>

<UL>
<P>IN function 用户定义的错误处理过程</P>

<P>OUT errhandler MPI错误句柄(句柄)</P>
</UL>

<P>int MPI_Errhandler_create (MPI_Handler_function *function, MPI_Errhandler
*errhandler)</P>

<P>MPI_ERRHANDLER_CREATE ( FUNCTION, ERRHANDLER, IERROR)</P>

<UL>
<P>EXTERNAL FUNCTION</P>

<P>INTEGER ERRHANDLER, IERROR</P>
</UL>

<P>被注册的用户例程function,作为一个MPI异常句柄,在errhandler中将一个句柄返回到被注册的异常进程。
</P>

<UL>
<P>建议实现者:返回的句柄可以包含错误处理例程的地址。这个调用在C中是多余的,它存在引用操作符,但在Fortran中是不必要的。(建议实现者结束)</P>
</UL>

<P>用户例程应该是类型为MPI_Handler_function的C函数,定义如下:</P>

<P>typedef void (MPI_Handler_function) (MPI_Comm *, int *, …)</P>

<P>第一个参数是所用的通信子。第二个是由MPI例程所返回的错误代码。剩下的参数是数字和意义依赖于机器的“stdargs”参数。具体实现应该清晰的将这些参数写在文档中。使用地址,使得可以在Fortran中写句柄。</P>

<UL>
<P>理由:变量列表被提供,因为它提供一个ANSI标准的钩子,以向错误句柄提供附加信息;没有这个钩子,ANSI
C禁止附加参数。(理由结束)</P>
</UL>

<P>MPI_ERRHANDLER_SET ( comm, errhandler)</P>

<UL>
<P>IN comm 设置错误句柄的通信子(句柄)</P>

<P>IN errhandler 对于通信子的新的MPI错误句柄(句柄)</P>
</UL>

<P>int MPI_Errhandler_set (MPI_Comm comm, MPI_ERrhandler errhandler)</P>

<P>MPI_ERRHANDLER_SET ( COMM, ERRHANDLER, IERROR)</P>

<UL>
<P>INTEGER COMM, ERRHANDLER, IERROR</P>
</UL>

<P>在调用进程中将新的错误句柄errorhandler与通信子comm相联系。注意错误句柄总是同通信子相联系。
</P>

<P>MPI_ERRHANDLER_GET(comm, errhandler)</P>

<UL>
<P>IN comm 获取错误句柄的通信子(句柄)</P>

<P>OUT errhandler 当前与通信子相连的MPI错误句柄(句柄)</P>
</UL>

<P>int MPI_Errhandler_get (MPI_Comm comm, MPI_ERrhandler errhandler)</P>

<P>MPI_ERRHANDLER_GET ( COMM, ERRHANDLER, IERROR)</P>

<UL>
<P>INTEGER COMM, ERRHANDLER, IERROR</P>
</UL>

<P>在errhandler中返回当前与通信子comm相连的错误句柄。</P>

<P>例:一个库函数可以在它的入口点注册为对于通信子的当前错误句柄,为这个通信子设置它自己私有的错误句柄,并且在退出前面的错误句柄之前恢复。
</P>

<P>MPI_ERRHANDLER_FREE ( errhandler)</P>

<UL>
<P>IN errhandler MPI错误句柄(句柄)</P>
</UL>

<P>int MPI_Errhandler_free (MPI_Errhandler *errhandler)</P>

<P>MPI_ERRHANDLER_FREE ( ERRHANDLER, IERROR)</P>

<UL>
<P>INTEGER ERRHANDLER, IERROR</P>
</UL>

<P>标记与errhandler相联系的错误句柄,以将errhandler释放或设置成MPI_ERRHANDLERNULL。错误句柄将在所有与其相连的通信子释放后被释放。
</P>

<P>MPI_ERROR_STRING (errorcode, string, resultlen)</P>

<UL>
<P>IN errorcode 由MPI例程返回的错误码</P>

<P>OUT string 相应于errorcode的文字</P>

<P>OUT resultlen 在string中所返回结果的长度</P>
</UL>

<P>int MPI_Error_string (int errorcode, char *string, int *resultlen)</P>

<P>MPI_ERROR_STRING (ERRORCODE, STRING, RESULTLEN, IERROR)</P>

<UL>
<P>INTEGER ERRORCODE, RESULTLEN, IERROR</P>

<P>CHARACTER *(*) STRING</P>
</UL>

<P>返回与一错误码相联系的错误串。参数string必须代表至少MPI_MAX_ERROR_STRING字符长的存储空间。
</P>

<P>实际上所写的字符数在输出参数resulten中返回。</P>

<UL>
<P>理由:这个函数形式的选择,使得Fortran和C约束相似。返回一个指向字符串的指针版本,存在两个困难。第一,返回字符串必须静态分配且对于每一错误消息都不同。(允许连续调用MPI_ERROR_STRING所返回的指针,以指向正确的消息)第二,在Fortran中,声明为返回CHARACTER*(*)的函数不能被引用,例如,PRINT语句。(理由结束)</P>
</UL>

<P>
<HR WIDTH="100%"></P>

<TABLE WIDTH="100%" >
<TR>
<TD align=left>Copyright: NPACT </TD>

<TD align=right><A HREF="mpi71.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi71.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A>
<A HREF="mpi73.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi73.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A></TD>
</TR>
</TABLE>

</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -