annotate src/fftw-3.3.5/doc/html/FFTW-MPI-Wisdom.html @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 2cd0e3b3e1fd
children
rev   line source
Chris@42 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Chris@42 2 <html>
Chris@42 3 <!-- This manual is for FFTW
Chris@42 4 (version 3.3.5, 30 July 2016).
Chris@42 5
Chris@42 6 Copyright (C) 2003 Matteo Frigo.
Chris@42 7
Chris@42 8 Copyright (C) 2003 Massachusetts Institute of Technology.
Chris@42 9
Chris@42 10 Permission is granted to make and distribute verbatim copies of this
Chris@42 11 manual provided the copyright notice and this permission notice are
Chris@42 12 preserved on all copies.
Chris@42 13
Chris@42 14 Permission is granted to copy and distribute modified versions of this
Chris@42 15 manual under the conditions for verbatim copying, provided that the
Chris@42 16 entire resulting derived work is distributed under the terms of a
Chris@42 17 permission notice identical to this one.
Chris@42 18
Chris@42 19 Permission is granted to copy and distribute translations of this manual
Chris@42 20 into another language, under the above conditions for modified versions,
Chris@42 21 except that this permission notice may be stated in a translation
Chris@42 22 approved by the Free Software Foundation. -->
Chris@42 23 <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
Chris@42 24 <head>
Chris@42 25 <title>FFTW 3.3.5: FFTW MPI Wisdom</title>
Chris@42 26
Chris@42 27 <meta name="description" content="FFTW 3.3.5: FFTW MPI Wisdom">
Chris@42 28 <meta name="keywords" content="FFTW 3.3.5: FFTW MPI Wisdom">
Chris@42 29 <meta name="resource-type" content="document">
Chris@42 30 <meta name="distribution" content="global">
Chris@42 31 <meta name="Generator" content="makeinfo">
Chris@42 32 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Chris@42 33 <link href="index.html#Top" rel="start" title="Top">
Chris@42 34 <link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
Chris@42 35 <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
Chris@42 36 <link href="Distributed_002dmemory-FFTW-with-MPI.html#Distributed_002dmemory-FFTW-with-MPI" rel="up" title="Distributed-memory FFTW with MPI">
Chris@42 37 <link href="Avoiding-MPI-Deadlocks.html#Avoiding-MPI-Deadlocks" rel="next" title="Avoiding MPI Deadlocks">
Chris@42 38 <link href="An-improved-replacement-for-MPI_005fAlltoall.html#An-improved-replacement-for-MPI_005fAlltoall" rel="prev" title="An improved replacement for MPI_Alltoall">
Chris@42 39 <style type="text/css">
Chris@42 40 <!--
Chris@42 41 a.summary-letter {text-decoration: none}
Chris@42 42 blockquote.smallquotation {font-size: smaller}
Chris@42 43 div.display {margin-left: 3.2em}
Chris@42 44 div.example {margin-left: 3.2em}
Chris@42 45 div.indentedblock {margin-left: 3.2em}
Chris@42 46 div.lisp {margin-left: 3.2em}
Chris@42 47 div.smalldisplay {margin-left: 3.2em}
Chris@42 48 div.smallexample {margin-left: 3.2em}
Chris@42 49 div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
Chris@42 50 div.smalllisp {margin-left: 3.2em}
Chris@42 51 kbd {font-style:oblique}
Chris@42 52 pre.display {font-family: inherit}
Chris@42 53 pre.format {font-family: inherit}
Chris@42 54 pre.menu-comment {font-family: serif}
Chris@42 55 pre.menu-preformatted {font-family: serif}
Chris@42 56 pre.smalldisplay {font-family: inherit; font-size: smaller}
Chris@42 57 pre.smallexample {font-size: smaller}
Chris@42 58 pre.smallformat {font-family: inherit; font-size: smaller}
Chris@42 59 pre.smalllisp {font-size: smaller}
Chris@42 60 span.nocodebreak {white-space:nowrap}
Chris@42 61 span.nolinebreak {white-space:nowrap}
Chris@42 62 span.roman {font-family:serif; font-weight:normal}
Chris@42 63 span.sansserif {font-family:sans-serif; font-weight:normal}
Chris@42 64 ul.no-bullet {list-style: none}
Chris@42 65 -->
Chris@42 66 </style>
Chris@42 67
Chris@42 68
Chris@42 69 </head>
Chris@42 70
Chris@42 71 <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
Chris@42 72 <a name="FFTW-MPI-Wisdom"></a>
Chris@42 73 <div class="header">
Chris@42 74 <p>
Chris@42 75 Next: <a href="Avoiding-MPI-Deadlocks.html#Avoiding-MPI-Deadlocks" accesskey="n" rel="next">Avoiding MPI Deadlocks</a>, Previous: <a href="FFTW-MPI-Transposes.html#FFTW-MPI-Transposes" accesskey="p" rel="prev">FFTW MPI Transposes</a>, Up: <a href="Distributed_002dmemory-FFTW-with-MPI.html#Distributed_002dmemory-FFTW-with-MPI" accesskey="u" rel="up">Distributed-memory FFTW with MPI</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
Chris@42 76 </div>
Chris@42 77 <hr>
Chris@42 78 <a name="FFTW-MPI-Wisdom-1"></a>
Chris@42 79 <h3 class="section">6.8 FFTW MPI Wisdom</h3>
Chris@42 80 <a name="index-wisdom-2"></a>
Chris@42 81 <a name="index-saving-plans-to-disk-2"></a>
Chris@42 82
Chris@42 83 <p>FFTW&rsquo;s &ldquo;wisdom&rdquo; facility (see <a href="Words-of-Wisdom_002dSaving-Plans.html#Words-of-Wisdom_002dSaving-Plans">Words of Wisdom-Saving Plans</a>) can
Chris@42 84 be used to save MPI plans as well as to save uniprocessor plans.
Chris@42 85 However, for MPI there are several unavoidable complications.
Chris@42 86 </p>
Chris@42 87 <a name="index-MPI-I_002fO-1"></a>
Chris@42 88 <p>First, the MPI standard does not guarantee that every process can
Chris@42 89 perform file I/O (at least, not using C stdio routines)&mdash;in general,
Chris@42 90 we may only assume that process 0 is capable of I/O.<a name="DOCF7" href="#FOOT7"><sup>7</sup></a> So, if we
Chris@42 91 want to export the wisdom from a single process to a file, we must
Chris@42 92 first export the wisdom to a string, then send it to process 0, then
Chris@42 93 write it to a file.
Chris@42 94 </p>
Chris@42 95 <p>Second, in principle we may want to have separate wisdom for every
Chris@42 96 process, since in general the processes may run on different hardware
Chris@42 97 even for a single MPI program. However, in practice FFTW&rsquo;s MPI code
Chris@42 98 is designed for the case of homogeneous hardware (see <a href="Load-balancing.html#Load-balancing">Load balancing</a>), and in this case it is convenient to use the same wisdom
Chris@42 99 for every process. Thus, we need a mechanism to synchronize the wisdom.
Chris@42 100 </p>
Chris@42 101 <p>To address both of these problems, FFTW provides the following two
Chris@42 102 functions:
Chris@42 103 </p>
Chris@42 104 <div class="example">
Chris@42 105 <pre class="example">void fftw_mpi_broadcast_wisdom(MPI_Comm comm);
Chris@42 106 void fftw_mpi_gather_wisdom(MPI_Comm comm);
Chris@42 107 </pre></div>
Chris@42 108 <a name="index-fftw_005fmpi_005fgather_005fwisdom"></a>
Chris@42 109 <a name="index-fftw_005fmpi_005fbroadcast_005fwisdom"></a>
Chris@42 110
Chris@42 111 <p>Given a communicator <code>comm</code>, <code>fftw_mpi_broadcast_wisdom</code>
Chris@42 112 will broadcast the wisdom from process 0 to all other processes.
Chris@42 113 Conversely, <code>fftw_mpi_gather_wisdom</code> will collect wisdom from all
Chris@42 114 processes onto process 0. (If the plans created for the same problem
Chris@42 115 by different processes are not the same, <code>fftw_mpi_gather_wisdom</code>
Chris@42 116 will arbitrarily choose one of the plans.) Both of these functions
Chris@42 117 may result in suboptimal plans for different processes if the
Chris@42 118 processes are running on non-identical hardware. Both of these
Chris@42 119 functions are <em>collective</em> calls, which means that they must be
Chris@42 120 executed by all processes in the communicator.
Chris@42 121 <a name="index-collective-function-1"></a>
Chris@42 122 </p>
Chris@42 123
Chris@42 124 <p>So, for example, a typical code snippet to import wisdom from a file
Chris@42 125 and use it on all processes would be:
Chris@42 126 </p>
Chris@42 127 <div class="example">
Chris@42 128 <pre class="example">{
Chris@42 129 int rank;
Chris@42 130
Chris@42 131 fftw_mpi_init();
Chris@42 132 MPI_Comm_rank(MPI_COMM_WORLD, &amp;rank);
Chris@42 133 if (rank == 0) fftw_import_wisdom_from_filename(&quot;mywisdom&quot;);
Chris@42 134 fftw_mpi_broadcast_wisdom(MPI_COMM_WORLD);
Chris@42 135 }
Chris@42 136 </pre></div>
Chris@42 137
Chris@42 138 <p>(Note that we must call <code>fftw_mpi_init</code> before importing any
Chris@42 139 wisdom that might contain MPI plans.) Similarly, a typical code
Chris@42 140 snippet to export wisdom from all processes to a file is:
Chris@42 141 <a name="index-fftw_005fmpi_005finit-2"></a>
Chris@42 142 </p>
Chris@42 143 <div class="example">
Chris@42 144 <pre class="example">{
Chris@42 145 int rank;
Chris@42 146
Chris@42 147 fftw_mpi_gather_wisdom(MPI_COMM_WORLD);
Chris@42 148 MPI_Comm_rank(MPI_COMM_WORLD, &amp;rank);
Chris@42 149 if (rank == 0) fftw_export_wisdom_to_filename(&quot;mywisdom&quot;);
Chris@42 150 }
Chris@42 151 </pre></div>
Chris@42 152
Chris@42 153 <div class="footnote">
Chris@42 154 <hr>
Chris@42 155 <h4 class="footnotes-heading">Footnotes</h4>
Chris@42 156
Chris@42 157 <h3><a name="FOOT7" href="#DOCF7">(7)</a></h3>
Chris@42 158 <p>In fact,
Chris@42 159 even this assumption is not technically guaranteed by the standard,
Chris@42 160 although it seems to be universal in actual MPI implementations and is
Chris@42 161 widely assumed by MPI-using software. Technically, you need to query
Chris@42 162 the <code>MPI_IO</code> attribute of <code>MPI_COMM_WORLD</code> with
Chris@42 163 <code>MPI_Attr_get</code>. If this attribute is <code>MPI_PROC_NULL</code>, no
Chris@42 164 I/O is possible. If it is <code>MPI_ANY_SOURCE</code>, any process can
Chris@42 165 perform I/O. Otherwise, it is the rank of a process that can perform
Chris@42 166 I/O ... but since it is not guaranteed to yield the <em>same</em> rank
Chris@42 167 on all processes, you have to do an <code>MPI_Allreduce</code> of some kind
Chris@42 168 if you want all processes to agree about which is going to do I/O.
Chris@42 169 And even then, the standard only guarantees that this process can
Chris@42 170 perform output, but not input. See e.g. <cite>Parallel Programming
Chris@42 171 with MPI</cite> by P. S. Pacheco, section 8.1.3. Needless to say, in our
Chris@42 172 experience virtually no MPI programmers worry about this.</p>
Chris@42 173 </div>
Chris@42 174 <hr>
Chris@42 175 <div class="header">
Chris@42 176 <p>
Chris@42 177 Next: <a href="Avoiding-MPI-Deadlocks.html#Avoiding-MPI-Deadlocks" accesskey="n" rel="next">Avoiding MPI Deadlocks</a>, Previous: <a href="FFTW-MPI-Transposes.html#FFTW-MPI-Transposes" accesskey="p" rel="prev">FFTW MPI Transposes</a>, Up: <a href="Distributed_002dmemory-FFTW-with-MPI.html#Distributed_002dmemory-FFTW-with-MPI" accesskey="u" rel="up">Distributed-memory FFTW with MPI</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
Chris@42 178 </div>
Chris@42 179
Chris@42 180
Chris@42 181
Chris@42 182 </body>
Chris@42 183 </html>