annotate src/fftw-3.3.5/doc/threads.texi @ 155:54abead6ecce

Opus for Windows (MSVC)
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 25 Jan 2019 12:15:58 +0000
parents 7867fa7e1b6b
children
rev   line source
cannam@127 1 @node Multi-threaded FFTW, Distributed-memory FFTW with MPI, FFTW Reference, Top
cannam@127 2 @chapter Multi-threaded FFTW
cannam@127 3
cannam@127 4 @cindex parallel transform
cannam@127 5 In this chapter we document the parallel FFTW routines for
cannam@127 6 shared-memory parallel hardware. These routines, which support
cannam@127 7 parallel one- and multi-dimensional transforms of both real and
cannam@127 8 complex data, are the easiest way to take advantage of multiple
cannam@127 9 processors with FFTW. They work just like the corresponding
cannam@127 10 uniprocessor transform routines, except that you have an extra
cannam@127 11 initialization routine to call, and there is a routine to set the
cannam@127 12 number of threads to employ. Any program that uses the uniprocessor
cannam@127 13 FFTW can therefore be trivially modified to use the multi-threaded
cannam@127 14 FFTW.
cannam@127 15
cannam@127 16 A shared-memory machine is one in which all CPUs can directly access
cannam@127 17 the same main memory, and such machines are now common due to the
cannam@127 18 ubiquity of multi-core CPUs. FFTW's multi-threading support allows
cannam@127 19 you to utilize these additional CPUs transparently from a single
cannam@127 20 program. However, this does not necessarily translate into
cannam@127 21 performance gains---when multiple threads/CPUs are employed, there is
cannam@127 22 an overhead required for synchronization that may outweigh the
cannam@127 23 computatational parallelism. Therefore, you can only benefit from
cannam@127 24 threads if your problem is sufficiently large.
cannam@127 25 @cindex shared-memory
cannam@127 26 @cindex threads
cannam@127 27
cannam@127 28 @menu
cannam@127 29 * Installation and Supported Hardware/Software::
cannam@127 30 * Usage of Multi-threaded FFTW::
cannam@127 31 * How Many Threads to Use?::
cannam@127 32 * Thread safety::
cannam@127 33 @end menu
cannam@127 34
cannam@127 35 @c ------------------------------------------------------------
cannam@127 36 @node Installation and Supported Hardware/Software, Usage of Multi-threaded FFTW, Multi-threaded FFTW, Multi-threaded FFTW
cannam@127 37 @section Installation and Supported Hardware/Software
cannam@127 38
cannam@127 39 All of the FFTW threads code is located in the @code{threads}
cannam@127 40 subdirectory of the FFTW package. On Unix systems, the FFTW threads
cannam@127 41 libraries and header files can be automatically configured, compiled,
cannam@127 42 and installed along with the uniprocessor FFTW libraries simply by
cannam@127 43 including @code{--enable-threads} in the flags to the @code{configure}
cannam@127 44 script (@pxref{Installation on Unix}), or @code{--enable-openmp} to use
cannam@127 45 @uref{http://www.openmp.org,OpenMP} threads.
cannam@127 46 @fpindex configure
cannam@127 47
cannam@127 48
cannam@127 49 @cindex portability
cannam@127 50 @cindex OpenMP
cannam@127 51 The threads routines require your operating system to have some sort
cannam@127 52 of shared-memory threads support. Specifically, the FFTW threads
cannam@127 53 package works with POSIX threads (available on most Unix variants,
cannam@127 54 from GNU/Linux to MacOS X) and Win32 threads. OpenMP threads, which
cannam@127 55 are supported in many common compilers (e.g. gcc) are also supported,
cannam@127 56 and may give better performance on some systems. (OpenMP threads are
cannam@127 57 also useful if you are employing OpenMP in your own code, in order to
cannam@127 58 minimize conflicts between threading models.) If you have a
cannam@127 59 shared-memory machine that uses a different threads API, it should be
cannam@127 60 a simple matter of programming to include support for it; see the file
cannam@127 61 @code{threads/threads.c} for more detail.
cannam@127 62
cannam@127 63 You can compile FFTW with @emph{both} @code{--enable-threads} and
cannam@127 64 @code{--enable-openmp} at the same time, since they install libraries
cannam@127 65 with different names (@samp{fftw3_threads} and @samp{fftw3_omp}, as
cannam@127 66 described below). However, your programs may only link to @emph{one}
cannam@127 67 of these two libraries at a time.
cannam@127 68
cannam@127 69 Ideally, of course, you should also have multiple processors in order to
cannam@127 70 get any benefit from the threaded transforms.
cannam@127 71
cannam@127 72 @c ------------------------------------------------------------
cannam@127 73 @node Usage of Multi-threaded FFTW, How Many Threads to Use?, Installation and Supported Hardware/Software, Multi-threaded FFTW
cannam@127 74 @section Usage of Multi-threaded FFTW
cannam@127 75
cannam@127 76 Here, it is assumed that the reader is already familiar with the usage
cannam@127 77 of the uniprocessor FFTW routines, described elsewhere in this manual.
cannam@127 78 We only describe what one has to change in order to use the
cannam@127 79 multi-threaded routines.
cannam@127 80
cannam@127 81 @cindex OpenMP
cannam@127 82 First, programs using the parallel complex transforms should be linked
cannam@127 83 with @code{-lfftw3_threads -lfftw3 -lm} on Unix, or @code{-lfftw3_omp
cannam@127 84 -lfftw3 -lm} if you compiled with OpenMP. You will also need to link
cannam@127 85 with whatever library is responsible for threads on your system
cannam@127 86 (e.g. @code{-lpthread} on GNU/Linux) or include whatever compiler flag
cannam@127 87 enables OpenMP (e.g. @code{-fopenmp} with gcc).
cannam@127 88 @cindex linking on Unix
cannam@127 89
cannam@127 90
cannam@127 91 Second, before calling @emph{any} FFTW routines, you should call the
cannam@127 92 function:
cannam@127 93
cannam@127 94 @example
cannam@127 95 int fftw_init_threads(void);
cannam@127 96 @end example
cannam@127 97 @findex fftw_init_threads
cannam@127 98
cannam@127 99 This function, which need only be called once, performs any one-time
cannam@127 100 initialization required to use threads on your system. It returns zero
cannam@127 101 if there was some error (which should not happen under normal
cannam@127 102 circumstances) and a non-zero value otherwise.
cannam@127 103
cannam@127 104 Third, before creating a plan that you want to parallelize, you should
cannam@127 105 call:
cannam@127 106
cannam@127 107 @example
cannam@127 108 void fftw_plan_with_nthreads(int nthreads);
cannam@127 109 @end example
cannam@127 110 @findex fftw_plan_with_nthreads
cannam@127 111
cannam@127 112 The @code{nthreads} argument indicates the number of threads you want
cannam@127 113 FFTW to use (or actually, the maximum number). All plans subsequently
cannam@127 114 created with any planner routine will use that many threads. You can
cannam@127 115 call @code{fftw_plan_with_nthreads}, create some plans, call
cannam@127 116 @code{fftw_plan_with_nthreads} again with a different argument, and
cannam@127 117 create some more plans for a new number of threads. Plans already created
cannam@127 118 before a call to @code{fftw_plan_with_nthreads} are unaffected. If you
cannam@127 119 pass an @code{nthreads} argument of @code{1} (the default), threads are
cannam@127 120 disabled for subsequent plans.
cannam@127 121
cannam@127 122 @cindex OpenMP
cannam@127 123 With OpenMP, to configure FFTW to use all of the currently running
cannam@127 124 OpenMP threads (set by @code{omp_set_num_threads(nthreads)} or by the
cannam@127 125 @code{OMP_NUM_THREADS} environment variable), you can do:
cannam@127 126 @code{fftw_plan_with_nthreads(omp_get_max_threads())}. (The @samp{omp_}
cannam@127 127 OpenMP functions are declared via @code{#include <omp.h>}.)
cannam@127 128
cannam@127 129 @cindex thread safety
cannam@127 130 Given a plan, you then execute it as usual with
cannam@127 131 @code{fftw_execute(plan)}, and the execution will use the number of
cannam@127 132 threads specified when the plan was created. When done, you destroy
cannam@127 133 it as usual with @code{fftw_destroy_plan}. As described in
cannam@127 134 @ref{Thread safety}, plan @emph{execution} is thread-safe, but plan
cannam@127 135 creation and destruction are @emph{not}: you should create/destroy
cannam@127 136 plans only from a single thread, but can safely execute multiple plans
cannam@127 137 in parallel.
cannam@127 138
cannam@127 139 There is one additional routine: if you want to get rid of all memory
cannam@127 140 and other resources allocated internally by FFTW, you can call:
cannam@127 141
cannam@127 142 @example
cannam@127 143 void fftw_cleanup_threads(void);
cannam@127 144 @end example
cannam@127 145 @findex fftw_cleanup_threads
cannam@127 146
cannam@127 147 which is much like the @code{fftw_cleanup()} function except that it
cannam@127 148 also gets rid of threads-related data. You must @emph{not} execute any
cannam@127 149 previously created plans after calling this function.
cannam@127 150
cannam@127 151 We should also mention one other restriction: if you save wisdom from a
cannam@127 152 program using the multi-threaded FFTW, that wisdom @emph{cannot be used}
cannam@127 153 by a program using only the single-threaded FFTW (i.e. not calling
cannam@127 154 @code{fftw_init_threads}). @xref{Words of Wisdom-Saving Plans}.
cannam@127 155
cannam@127 156 @c ------------------------------------------------------------
cannam@127 157 @node How Many Threads to Use?, Thread safety, Usage of Multi-threaded FFTW, Multi-threaded FFTW
cannam@127 158 @section How Many Threads to Use?
cannam@127 159
cannam@127 160 @cindex number of threads
cannam@127 161 There is a fair amount of overhead involved in synchronizing threads,
cannam@127 162 so the optimal number of threads to use depends upon the size of the
cannam@127 163 transform as well as on the number of processors you have.
cannam@127 164
cannam@127 165 As a general rule, you don't want to use more threads than you have
cannam@127 166 processors. (Using more threads will work, but there will be extra
cannam@127 167 overhead with no benefit.) In fact, if the problem size is too small,
cannam@127 168 you may want to use fewer threads than you have processors.
cannam@127 169
cannam@127 170 You will have to experiment with your system to see what level of
cannam@127 171 parallelization is best for your problem size. Typically, the problem
cannam@127 172 will have to involve at least a few thousand data points before threads
cannam@127 173 become beneficial. If you plan with @code{FFTW_PATIENT}, it will
cannam@127 174 automatically disable threads for sizes that don't benefit from
cannam@127 175 parallelization.
cannam@127 176 @ctindex FFTW_PATIENT
cannam@127 177
cannam@127 178 @c ------------------------------------------------------------
cannam@127 179 @node Thread safety, , How Many Threads to Use?, Multi-threaded FFTW
cannam@127 180 @section Thread safety
cannam@127 181
cannam@127 182 @cindex threads
cannam@127 183 @cindex OpenMP
cannam@127 184 @cindex thread safety
cannam@127 185 Users writing multi-threaded programs (including OpenMP) must concern
cannam@127 186 themselves with the @dfn{thread safety} of the libraries they
cannam@127 187 use---that is, whether it is safe to call routines in parallel from
cannam@127 188 multiple threads. FFTW can be used in such an environment, but some
cannam@127 189 care must be taken because the planner routines share data
cannam@127 190 (e.g. wisdom and trigonometric tables) between calls and plans.
cannam@127 191
cannam@127 192 The upshot is that the only thread-safe (re-entrant) routine in FFTW is
cannam@127 193 @code{fftw_execute} (and the new-array variants thereof). All other routines
cannam@127 194 (e.g. the planner) should only be called from one thread at a time. So,
cannam@127 195 for example, you can wrap a semaphore lock around any calls to the
cannam@127 196 planner; even more simply, you can just create all of your plans from
cannam@127 197 one thread. We do not think this should be an important restriction
cannam@127 198 (FFTW is designed for the situation where the only performance-sensitive
cannam@127 199 code is the actual execution of the transform), and the benefits of
cannam@127 200 shared data between plans are great.
cannam@127 201
cannam@127 202 Note also that, since the plan is not modified by @code{fftw_execute},
cannam@127 203 it is safe to execute the @emph{same plan} in parallel by multiple
cannam@127 204 threads. However, since a given plan operates by default on a fixed
cannam@127 205 array, you need to use one of the new-array execute functions (@pxref{New-array Execute Functions}) so that different threads compute the transform of different data.
cannam@127 206
cannam@127 207 (Users should note that these comments only apply to programs using
cannam@127 208 shared-memory threads or OpenMP. Parallelism using MPI or forked processes
cannam@127 209 involves a separate address-space and global variables for each process,
cannam@127 210 and is not susceptible to problems of this sort.)
cannam@127 211
cannam@127 212 If you are configured FFTW with the @code{--enable-debug} or
cannam@127 213 @code{--enable-debug-malloc} flags (@pxref{Installation on Unix}),
cannam@127 214 then @code{fftw_execute} is not thread-safe. These flags are not
cannam@127 215 documented because they are intended only for developing
cannam@127 216 and debugging FFTW, but if you must use @code{--enable-debug} then you
cannam@127 217 should also specifically pass @code{--disable-debug-malloc} for
cannam@127 218 @code{fftw_execute} to be thread-safe.
cannam@127 219
cannam@127 220 Starting from FFTW-3.3.5, FFTW supports a new API to make the
cannam@127 221 planner thread-safe:
cannam@127 222 @example
cannam@127 223 void fftw_make_planner_thread_safe(void);
cannam@127 224 @end example
cannam@127 225 @findex fftw_make_planner_thread_safe
cannam@127 226
cannam@127 227 This call installs a hook that wraps a lock around all planner calls.
cannam@127 228 This API is meant for ``applications'' that use ``plugins'' in multiple
cannam@127 229 threads, where each ``plugin'' calls single-threaded FFTW but is unaware
cannam@127 230 of the other ``plugins'' doing the same thing at the same time. In this
cannam@127 231 case, the ``application'' calls @code{fftw_make_planner_thread_safe()}
cannam@127 232 at the beginning to protect ``plugins'' from each other.