<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7036.0">
<TITLE>RE: [mpich-discuss] How does the fortran binding work?</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>&nbsp;Hi,<BR>
&nbsp; Visual Studio C compiler does not support weak symbols (So you don't have to worry about the weak symbols stuff). mpich2.dll (or variants) export both MPI_* and PMPI_* symbols to the user of the Dll (see mpich2.def). This is required (see the standard on the profiling interface) to support third-party profiling interface to MPI (which is what you probably need :) ).<BR>
&nbsp; The windows binding dll (mpich2mpi.dll) allows one to load a channel or profile MPI at run time. Although this is the current design we will soon be migrating to the current design in unix to support dynamically loadable channels (Only the channel is loaded dynamically).<BR>
&nbsp; If you are trying to instrument MPI calls as defined in the MPI standard, define a profiling interface with the required MPI_* interfaces, do the required profiling there and call the PMPI_* interface (in mpi.lib). To provide a profiling interface for fortran MPI programs provide an interface to the fortran binding interfaces (app calls MPI_SEND, define MPI_SEND in profiling lib - do the profiling, call PMPI_SEND in fortran binding interface (fmpich2.lib), which will call PMPI_Send() - translated to MPI_Send() in mpich2.dll to do the real work.).<BR>
(PS: Note that this is different from the way it works in unix systems.)<BR>
&nbsp;Let us know if you need any further info.<BR>
<BR>
Regards,<BR>
Jayesh<BR>
<BR>
-----Original Message-----<BR>
From: Ruini Xue [<A HREF="mailto:xueruini@gmail.com">mailto:xueruini@gmail.com</A>]<BR>
Sent: Thursday, July 31, 2008 8:46 AM<BR>
To: Jayesh Krishna<BR>
Cc: mpich-discuss@mcs.anl.gov<BR>
Subject: Re: [mpich-discuss] How does the fortran binding work?<BR>
<BR>
On Wed, Jul 30, 2008 at 11:54 PM, Jayesh Krishna &lt;jayesh@mcs.anl.gov&gt; wrote:<BR>
&gt;&nbsp; Hi,<BR>
&gt;&nbsp;&nbsp; In MPICH2 implementation on windows the fortran bindings work as<BR>
&gt; below,<BR>
&gt;<BR>
&gt; 1) Fortran bindings (see src/binding/f77/*) are wrapper funcs which do<BR>
&gt; minimal work and call PMPI_* funcs to do the real work (This is done<BR>
&gt; by fmpich2.dll).<BR>
&gt;<BR>
&gt; 2) PMPI_* (read as &quot;Profiling&quot;MPI_* -- check the standard,<BR>
&gt; <A HREF="http://www.mpi-forum.org/docs/mpi-11-html/mpi-report.html">http://www.mpi-forum.org/docs/mpi-11-html/mpi-report.html</A>, for more<BR>
&gt; information on the MPI Profiling interface ) are defined to be MPI_*<BR>
&gt; functions if no profiling library (MPE -- see section &quot;Runtime<BR>
&gt; environment&quot;--&gt; &quot;Performance Analysis&quot; in the windows developer's<BR>
&gt; guide, available at<BR>
&gt; <A HREF="http://www.mcs.anl.gov/research/projects/mpich2/documentation/index.ph">http://www.mcs.anl.gov/research/projects/mpich2/documentation/index.ph</A><BR>
&gt; p?s=docs, for information on how you can use MPE with your programs)<BR>
&gt; is provided or are defined as PMPI_* functions when a profiling<BR>
&gt; library is provided. (This is done by mpich2mpi.dll)<BR>
&gt;<BR>
&gt; 3) Either the profiling library (mpe.dll) or the windows binding<BR>
&gt; library<BR>
&gt; (mpich2mpi.dll) calls the MPI_* functions defined in mpich2.dll (for<BR>
&gt; single threaded sock channel - in case of other channels variants of<BR>
&gt; mpich2.dll) to do the real work.<BR>
&gt;<BR>
&gt;&nbsp; Let us know if you have any questions.<BR>
After going through the source today, I got a deep understand how these three DLLs work together:<BR>
- fmpich2.dll: the Fortran binding, it calls PMPI version in mpich2mpi.dll.<BR>
<BR>
- mpich2mpi.dll: the &quot;windows&quot; c binding. This dll is very interesting. It exports all MPI_* and PMPI_* functions, and contains a big function pointer struct holding all standard MPI_* and PMPI_* interface. This dll is loaded if your application is linked with the default mpi.lib.&nbsp; It&nbsp; would load mpich2.dll dynamically to map the function pointers to the corresponding functions in mpich2.dll. The codes seem like this (src/ util/ multichannel/mpi.c):<BR>
//////////////////////////<BR>
static struct fn_table<BR>
{<BR>
int (*MPI_Send)(void*, int, MPI_Datatype, int, int, MPI_Comm); int (*PMPI_Send)(void*, int, MPI_Datatype, int, int, MPI_Comm); .....<BR>
};<BR>
<BR>
#define MPICH_CHECK_INIT(a) if ((fn. a) == NULL &amp;&amp; LoadMPILibrary() ==<BR>
FALSE) return MPI_ERR_INTERN;<BR>
<BR>
#undef FCNAME<BR>
#define FCNAME MPI_Send<BR>
int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; MPI_Comm comm)<BR>
{<BR>
&nbsp;&nbsp;&nbsp; MPICH_CHECK_INIT(FCNAME);<BR>
&nbsp;&nbsp;&nbsp; return fn.MPI_Send(buf, count, datatype, dest, tag, comm); } /////////////////////////////////////<BR>
<BR>
It is clear that mpich2mpi.dll has its own MPI_* and PMPI_*, and they are simple wrappers to the functions in mpich2.dll.<BR>
mpich2.dll is loaded by LoadMPILibrary() which is called by the first MPI call (since LoadLibrary() is not allowed in DllMain).<BR>
<BR>
- mpich2.dll: the real worker also the real c binding (for socket implementation). It contains real implementation of PMPI_*, and<BR>
&nbsp; MPI_* are weakly defined to them.<BR>
<BR>
Now, we can understand why a fortran application need fmpich2.dll and mpich2mpi.dll, and a c application needs only mpich2mpi.dll, but none of them explicitly depends on mpich2.dll.<BR>
<BR>
PS, why I dive so deep into these dlls is because I am working on a MPI replay project, which use binary instrumentation to hook MPI calls. Therefore, I want to make sure who is the most underlying worker. Now, I want to know whether I am right. :)<BR>
<BR>
Best<BR>
<BR>
Andrew<BR>
<BR>
&gt;<BR>
&gt; (PS: This is different from the way its handled in MPICH2 on unix.)<BR>
&gt;<BR>
&gt; Regards,<BR>
&gt; Jayesh<BR>
&gt;<BR>
&gt; -----Original Message-----<BR>
&gt; From: owner-mpich-discuss@mcs.anl.gov<BR>
&gt; [<A HREF="mailto:owner-mpich-discuss@mcs.anl.gov">mailto:owner-mpich-discuss@mcs.anl.gov</A>] On Behalf Of Anthony Chan<BR>
&gt; Sent: Wednesday, July 30, 2008 9:46 AM<BR>
&gt; To: mpich-discuss@mcs.anl.gov<BR>
&gt; Cc: mpich-discuss@mcs.anl.gov<BR>
&gt; Subject: Re: [mpich-discuss] How does the fortran binding work?<BR>
&gt;<BR>
&gt;<BR>
&gt; No.&nbsp; PMPI is the MPI profiling interface and is standardized by the<BR>
&gt; MPI forum.<BR>
&gt; Fortran/C++ MPI binding just calls the C MPI routine.<BR>
&gt;<BR>
&gt; A.Chan<BR>
&gt;<BR>
&gt; ----- &quot;Ruini Xue&quot; &lt;xueruini@gmail.com&gt; wrote:<BR>
&gt;<BR>
&gt;&gt; On Wed, Jul 30, 2008 at 8:54 PM, Dave Goodell &lt; goodell@mcs.anl.gov &gt;<BR>
&gt;&gt; wrote:<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; Hi Andrew,<BR>
&gt;&gt;<BR>
&gt;&gt; Yes, the fortran and c++ bindings are just wrappers over the C<BR>
&gt;&gt; bindings. The C binding implements the functionality directly.<BR>
&gt;&gt;<BR>
&gt;&gt; Are they wrappers of MPI_XXX() or PMPI_XXX()?<BR>
&gt;&gt;<BR>
&gt;&gt; Best<BR>
&gt;&gt;<BR>
&gt;&gt; Andrew<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; -Dave<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; On Jul 30, 2008, at 6:11 AM, Ruini Xue wrote:<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; Hello, everyone,<BR>
&gt;&gt;<BR>
&gt;&gt; I am working with MPICH2 on Windows platfrom. The fortran MIP<BR>
&gt;&gt; application is linked to fmpich.lib, and fmpich2.dll is loaded in<BR>
&gt;&gt; runtime, which in turn loads mipch2mpi.dll.<BR>
&gt;&gt; mpich2mpi.dll contains all MPI APIs which exported C interface. What<BR>
&gt;&gt; I want to know is: what is the 'underlying' relation between<BR>
&gt;&gt; fmpich2.dll and mpich2mip.dll? Do all Fortran MPI calls are converted<BR>
&gt;&gt; to c bindings in mpich2mpi.dll? For example, does MPI_BCAST() in<BR>
&gt;&gt; fmich2.dll directly calls MPI_Bcast() in mpich2mpi.dll? Is<BR>
&gt;&gt; MPI_BCAST() just a stub while MPI_Bcast() do the real job?<BR>
&gt;&gt;<BR>
&gt;&gt; Thanks<BR>
&gt;&gt;<BR>
&gt;&gt; Andrew<BR>
&gt;<BR>
&gt;<BR>
</FONT>
</P>

</BODY>
</HTML>