cannam@167
|
1 /*
|
cannam@167
|
2 * Copyright (c) 2003, 2007-14 Matteo Frigo
|
cannam@167
|
3 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
|
cannam@167
|
4 *
|
cannam@167
|
5 * The following statement of license applies *only* to this header file,
|
cannam@167
|
6 * and *not* to the other files distributed with FFTW or derived therefrom:
|
cannam@167
|
7 *
|
cannam@167
|
8 * Redistribution and use in source and binary forms, with or without
|
cannam@167
|
9 * modification, are permitted provided that the following conditions
|
cannam@167
|
10 * are met:
|
cannam@167
|
11 *
|
cannam@167
|
12 * 1. Redistributions of source code must retain the above copyright
|
cannam@167
|
13 * notice, this list of conditions and the following disclaimer.
|
cannam@167
|
14 *
|
cannam@167
|
15 * 2. Redistributions in binary form must reproduce the above copyright
|
cannam@167
|
16 * notice, this list of conditions and the following disclaimer in the
|
cannam@167
|
17 * documentation and/or other materials provided with the distribution.
|
cannam@167
|
18 *
|
cannam@167
|
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
cannam@167
|
20 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
cannam@167
|
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
cannam@167
|
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
cannam@167
|
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
cannam@167
|
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
cannam@167
|
25 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
cannam@167
|
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
cannam@167
|
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
cannam@167
|
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
cannam@167
|
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
cannam@167
|
30 */
|
cannam@167
|
31
|
cannam@167
|
32 /***************************** NOTE TO USERS *********************************
|
cannam@167
|
33 *
|
cannam@167
|
34 * THIS IS A HEADER FILE, NOT A MANUAL
|
cannam@167
|
35 *
|
cannam@167
|
36 * If you want to know how to use FFTW, please read the manual,
|
cannam@167
|
37 * online at http://www.fftw.org/doc/ and also included with FFTW.
|
cannam@167
|
38 * For a quick start, see the manual's tutorial section.
|
cannam@167
|
39 *
|
cannam@167
|
40 * (Reading header files to learn how to use a library is a habit
|
cannam@167
|
41 * stemming from code lacking a proper manual. Arguably, it's a
|
cannam@167
|
42 * *bad* habit in most cases, because header files can contain
|
cannam@167
|
43 * interfaces that are not part of the public, stable API.)
|
cannam@167
|
44 *
|
cannam@167
|
45 ****************************************************************************/
|
cannam@167
|
46
|
cannam@167
|
47 #ifndef FFTW3_MPI_H
|
cannam@167
|
48 #define FFTW3_MPI_H
|
cannam@167
|
49
|
cannam@167
|
50 #include <fftw3.h>
|
cannam@167
|
51 #include <mpi.h>
|
cannam@167
|
52
|
cannam@167
|
53 #ifdef __cplusplus
|
cannam@167
|
54 extern "C"
|
cannam@167
|
55 {
|
cannam@167
|
56 #endif /* __cplusplus */
|
cannam@167
|
57
|
cannam@167
|
58 struct fftw_mpi_ddim_do_not_use_me {
|
cannam@167
|
59 ptrdiff_t n; /* dimension size */
|
cannam@167
|
60 ptrdiff_t ib; /* input block */
|
cannam@167
|
61 ptrdiff_t ob; /* output block */
|
cannam@167
|
62 };
|
cannam@167
|
63
|
cannam@167
|
64 /*
|
cannam@167
|
65 huge second-order macro that defines prototypes for all API
|
cannam@167
|
66 functions. We expand this macro for each supported precision
|
cannam@167
|
67
|
cannam@167
|
68 XM: name-mangling macro (MPI)
|
cannam@167
|
69 X: name-mangling macro (serial)
|
cannam@167
|
70 R: real data type
|
cannam@167
|
71 C: complex data type
|
cannam@167
|
72 */
|
cannam@167
|
73
|
cannam@167
|
74 #define FFTW_MPI_DEFINE_API(XM, X, R, C) \
|
cannam@167
|
75 \
|
cannam@167
|
76 typedef struct fftw_mpi_ddim_do_not_use_me XM(ddim); \
|
cannam@167
|
77 \
|
cannam@167
|
78 FFTW_EXTERN void XM(init)(void); \
|
cannam@167
|
79 FFTW_EXTERN void XM(cleanup)(void); \
|
cannam@167
|
80 \
|
cannam@167
|
81 FFTW_EXTERN ptrdiff_t XM(local_size_many_transposed) \
|
cannam@167
|
82 (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \
|
cannam@167
|
83 ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm, \
|
cannam@167
|
84 ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \
|
cannam@167
|
85 ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \
|
cannam@167
|
86 FFTW_EXTERN ptrdiff_t XM(local_size_many) \
|
cannam@167
|
87 (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \
|
cannam@167
|
88 ptrdiff_t block0, MPI_Comm comm, \
|
cannam@167
|
89 ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \
|
cannam@167
|
90 FFTW_EXTERN ptrdiff_t XM(local_size_transposed) \
|
cannam@167
|
91 (int rnk, const ptrdiff_t *n, MPI_Comm comm, \
|
cannam@167
|
92 ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \
|
cannam@167
|
93 ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \
|
cannam@167
|
94 FFTW_EXTERN ptrdiff_t XM(local_size) \
|
cannam@167
|
95 (int rnk, const ptrdiff_t *n, MPI_Comm comm, \
|
cannam@167
|
96 ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \
|
cannam@167
|
97 FFTW_EXTERN ptrdiff_t XM(local_size_many_1d)( \
|
cannam@167
|
98 ptrdiff_t n0, ptrdiff_t howmany, \
|
cannam@167
|
99 MPI_Comm comm, int sign, unsigned flags, \
|
cannam@167
|
100 ptrdiff_t *local_ni, ptrdiff_t *local_i_start, \
|
cannam@167
|
101 ptrdiff_t *local_no, ptrdiff_t *local_o_start); \
|
cannam@167
|
102 FFTW_EXTERN ptrdiff_t XM(local_size_1d)( \
|
cannam@167
|
103 ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags, \
|
cannam@167
|
104 ptrdiff_t *local_ni, ptrdiff_t *local_i_start, \
|
cannam@167
|
105 ptrdiff_t *local_no, ptrdiff_t *local_o_start); \
|
cannam@167
|
106 FFTW_EXTERN ptrdiff_t XM(local_size_2d)( \
|
cannam@167
|
107 ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, \
|
cannam@167
|
108 ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \
|
cannam@167
|
109 FFTW_EXTERN ptrdiff_t XM(local_size_2d_transposed)( \
|
cannam@167
|
110 ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, \
|
cannam@167
|
111 ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \
|
cannam@167
|
112 ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \
|
cannam@167
|
113 FFTW_EXTERN ptrdiff_t XM(local_size_3d)( \
|
cannam@167
|
114 ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm, \
|
cannam@167
|
115 ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \
|
cannam@167
|
116 FFTW_EXTERN ptrdiff_t XM(local_size_3d_transposed)( \
|
cannam@167
|
117 ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm, \
|
cannam@167
|
118 ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \
|
cannam@167
|
119 ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \
|
cannam@167
|
120 \
|
cannam@167
|
121 FFTW_EXTERN X(plan) XM(plan_many_transpose) \
|
cannam@167
|
122 (ptrdiff_t n0, ptrdiff_t n1, \
|
cannam@167
|
123 ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1, \
|
cannam@167
|
124 R *in, R *out, MPI_Comm comm, unsigned flags); \
|
cannam@167
|
125 FFTW_EXTERN X(plan) XM(plan_transpose) \
|
cannam@167
|
126 (ptrdiff_t n0, ptrdiff_t n1, \
|
cannam@167
|
127 R *in, R *out, MPI_Comm comm, unsigned flags); \
|
cannam@167
|
128 \
|
cannam@167
|
129 FFTW_EXTERN X(plan) XM(plan_many_dft) \
|
cannam@167
|
130 (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \
|
cannam@167
|
131 ptrdiff_t block, ptrdiff_t tblock, C *in, C *out, \
|
cannam@167
|
132 MPI_Comm comm, int sign, unsigned flags); \
|
cannam@167
|
133 FFTW_EXTERN X(plan) XM(plan_dft) \
|
cannam@167
|
134 (int rnk, const ptrdiff_t *n, C *in, C *out, \
|
cannam@167
|
135 MPI_Comm comm, int sign, unsigned flags); \
|
cannam@167
|
136 FFTW_EXTERN X(plan) XM(plan_dft_1d) \
|
cannam@167
|
137 (ptrdiff_t n0, C *in, C *out, \
|
cannam@167
|
138 MPI_Comm comm, int sign, unsigned flags); \
|
cannam@167
|
139 FFTW_EXTERN X(plan) XM(plan_dft_2d) \
|
cannam@167
|
140 (ptrdiff_t n0, ptrdiff_t n1, C *in, C *out, \
|
cannam@167
|
141 MPI_Comm comm, int sign, unsigned flags); \
|
cannam@167
|
142 FFTW_EXTERN X(plan) XM(plan_dft_3d) \
|
cannam@167
|
143 (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, C *out, \
|
cannam@167
|
144 MPI_Comm comm, int sign, unsigned flags); \
|
cannam@167
|
145 \
|
cannam@167
|
146 FFTW_EXTERN X(plan) XM(plan_many_r2r) \
|
cannam@167
|
147 (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \
|
cannam@167
|
148 ptrdiff_t iblock, ptrdiff_t oblock, R *in, R *out, \
|
cannam@167
|
149 MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags); \
|
cannam@167
|
150 FFTW_EXTERN X(plan) XM(plan_r2r) \
|
cannam@167
|
151 (int rnk, const ptrdiff_t *n, R *in, R *out, \
|
cannam@167
|
152 MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags); \
|
cannam@167
|
153 FFTW_EXTERN X(plan) XM(plan_r2r_2d) \
|
cannam@167
|
154 (ptrdiff_t n0, ptrdiff_t n1, R *in, R *out, MPI_Comm comm, \
|
cannam@167
|
155 X(r2r_kind) kind0, X(r2r_kind) kind1, unsigned flags); \
|
cannam@167
|
156 FFTW_EXTERN X(plan) XM(plan_r2r_3d) \
|
cannam@167
|
157 (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, \
|
cannam@167
|
158 R *in, R *out, MPI_Comm comm, X(r2r_kind) kind0, \
|
cannam@167
|
159 X(r2r_kind) kind1, X(r2r_kind) kind2, unsigned flags); \
|
cannam@167
|
160 \
|
cannam@167
|
161 FFTW_EXTERN X(plan) XM(plan_many_dft_r2c) \
|
cannam@167
|
162 (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \
|
cannam@167
|
163 ptrdiff_t iblock, ptrdiff_t oblock, R *in, C *out, \
|
cannam@167
|
164 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
165 FFTW_EXTERN X(plan) XM(plan_dft_r2c) \
|
cannam@167
|
166 (int rnk, const ptrdiff_t *n, R *in, C *out, \
|
cannam@167
|
167 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
168 FFTW_EXTERN X(plan) XM(plan_dft_r2c_2d) \
|
cannam@167
|
169 (ptrdiff_t n0, ptrdiff_t n1, R *in, C *out, \
|
cannam@167
|
170 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
171 FFTW_EXTERN X(plan) XM(plan_dft_r2c_3d) \
|
cannam@167
|
172 (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R *in, C *out, \
|
cannam@167
|
173 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
174 \
|
cannam@167
|
175 FFTW_EXTERN X(plan) XM(plan_many_dft_c2r) \
|
cannam@167
|
176 (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \
|
cannam@167
|
177 ptrdiff_t iblock, ptrdiff_t oblock, C *in, R *out, \
|
cannam@167
|
178 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
179 FFTW_EXTERN X(plan) XM(plan_dft_c2r) \
|
cannam@167
|
180 (int rnk, const ptrdiff_t *n, C *in, R *out, \
|
cannam@167
|
181 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
182 FFTW_EXTERN X(plan) XM(plan_dft_c2r_2d) \
|
cannam@167
|
183 (ptrdiff_t n0, ptrdiff_t n1, C *in, R *out, \
|
cannam@167
|
184 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
185 FFTW_EXTERN X(plan) XM(plan_dft_c2r_3d) \
|
cannam@167
|
186 (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, R *out, \
|
cannam@167
|
187 MPI_Comm comm, unsigned flags); \
|
cannam@167
|
188 \
|
cannam@167
|
189 FFTW_EXTERN void XM(gather_wisdom)(MPI_Comm comm_); \
|
cannam@167
|
190 FFTW_EXTERN void XM(broadcast_wisdom)(MPI_Comm comm_); \
|
cannam@167
|
191 \
|
cannam@167
|
192 FFTW_EXTERN void XM(execute_dft)(X(plan) p, C *in, C *out); \
|
cannam@167
|
193 FFTW_EXTERN void XM(execute_dft_r2c)(X(plan) p, R *in, C *out); \
|
cannam@167
|
194 FFTW_EXTERN void XM(execute_dft_c2r)(X(plan) p, C *in, R *out); \
|
cannam@167
|
195 FFTW_EXTERN void XM(execute_r2r)(X(plan) p, R *in, R *out);
|
cannam@167
|
196
|
cannam@167
|
197
|
cannam@167
|
198
|
cannam@167
|
199 /* end of FFTW_MPI_DEFINE_API macro */
|
cannam@167
|
200
|
cannam@167
|
201 #define FFTW_MPI_MANGLE_DOUBLE(name) FFTW_MANGLE_DOUBLE(FFTW_CONCAT(mpi_,name))
|
cannam@167
|
202 #define FFTW_MPI_MANGLE_FLOAT(name) FFTW_MANGLE_FLOAT(FFTW_CONCAT(mpi_,name))
|
cannam@167
|
203 #define FFTW_MPI_MANGLE_LONG_DOUBLE(name) FFTW_MANGLE_LONG_DOUBLE(FFTW_CONCAT(mpi_,name))
|
cannam@167
|
204
|
cannam@167
|
205 FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_DOUBLE, FFTW_MANGLE_DOUBLE, double, fftw_complex)
|
cannam@167
|
206 FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_FLOAT, FFTW_MANGLE_FLOAT, float, fftwf_complex)
|
cannam@167
|
207 FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_LONG_DOUBLE, FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex)
|
cannam@167
|
208
|
cannam@167
|
209 #define FFTW_MPI_DEFAULT_BLOCK (0)
|
cannam@167
|
210
|
cannam@167
|
211 /* MPI-specific flags */
|
cannam@167
|
212 #define FFTW_MPI_SCRAMBLED_IN (1U << 27)
|
cannam@167
|
213 #define FFTW_MPI_SCRAMBLED_OUT (1U << 28)
|
cannam@167
|
214 #define FFTW_MPI_TRANSPOSED_IN (1U << 29)
|
cannam@167
|
215 #define FFTW_MPI_TRANSPOSED_OUT (1U << 30)
|
cannam@167
|
216
|
cannam@167
|
217 #ifdef __cplusplus
|
cannam@167
|
218 } /* extern "C" */
|
cannam@167
|
219 #endif /* __cplusplus */
|
cannam@167
|
220
|
cannam@167
|
221 #endif /* FFTW3_MPI_H */
|