comparison src/fftw-3.3.8/doc/html/FFTW-MPI-Wisdom.html @ 167:bd3cc4d1df30

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