comparison src/fftw-3.3.3/mpi/fftw3-mpi.h @ 10:37bf6b4a2645

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