fftw_mpi.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * Copyright (c) 1997-1999, 2003 Massachusetts Institute of Technology
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
  16. * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  17. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  19. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  21. * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  22. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  23. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #ifndef FFTW_MPI_H
  28. #define FFTW_MPI_H
  29. #include <mpi.h> /* need access to the MPI type definitions */
  30. #include "fftw.h"
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif /* __cplusplus */
  34. #ifndef MKL_INT
  35. #define MKL_INT int
  36. #endif
  37. /***********************************************************************/
  38. typedef fftw_real TRANSPOSE_EL_TYPE;
  39. typedef struct {
  40. int block_num, dest_pe, send_size, recv_size;
  41. } transpose_mpi_exchange;
  42. typedef struct {
  43. MPI_Comm comm;
  44. int n_pes, my_pe;
  45. int nx,ny,local_nx,local_ny;
  46. transpose_mpi_exchange *exchange;
  47. int num_steps, send_block_size, recv_block_size;
  48. MPI_Datatype el_type;
  49. MPI_Request request[2];
  50. int *perm_block_dest;
  51. int num_perm_blocks, perm_block_size;
  52. int all_blocks_equal;
  53. int *send_block_sizes, *send_block_offsets;
  54. int *recv_block_sizes, *recv_block_offsets;
  55. char *move;
  56. int move_size;
  57. } transpose_mpi_plan_struct;
  58. typedef transpose_mpi_plan_struct *transpose_mpi_plan;
  59. extern void transpose_mpi_get_local_size(int n, int my_pe, int n_pes,
  60. int *local_n, int *local_start);
  61. extern int transpose_mpi_get_local_storage_size(int nx, int ny,
  62. int my_pe, int n_pes);
  63. extern transpose_mpi_plan transpose_mpi_create_plan(int nx, int ny,
  64. MPI_Comm comm);
  65. extern void transpose_mpi_destroy_plan(transpose_mpi_plan p);
  66. extern void transpose_mpi(transpose_mpi_plan p, int el_size,
  67. TRANSPOSE_EL_TYPE *local_data,
  68. TRANSPOSE_EL_TYPE *work);
  69. typedef enum { BEFORE_TRANSPOSE, AFTER_TRANSPOSE } transpose_in_place_which;
  70. typedef enum { TRANSPOSE_SYNC, TRANSPOSE_ASYNC } transpose_sync_type;
  71. extern void transpose_in_place_local(transpose_mpi_plan p,
  72. int el_size, TRANSPOSE_EL_TYPE *local_data,
  73. transpose_in_place_which which);
  74. extern TRANSPOSE_EL_TYPE *transpose_allocate_send_buf(transpose_mpi_plan p,
  75. int el_size);
  76. extern void transpose_get_send_block(transpose_mpi_plan p, int step,
  77. int *block_y_start, int *block_ny);
  78. extern void transpose_start_exchange_step(transpose_mpi_plan p,
  79. int el_size,
  80. TRANSPOSE_EL_TYPE *local_data,
  81. TRANSPOSE_EL_TYPE *send_buf,
  82. int step,
  83. transpose_sync_type sync_type);
  84. extern void transpose_finish_exchange_step(transpose_mpi_plan p, int step);
  85. /***********************************************************************/
  86. typedef struct {
  87. fftw_plan p_fft_x; /* plan for first dimension */
  88. fftwnd_plan p_fft; /* plan for subsequent dimensions */
  89. transpose_mpi_plan p_transpose, p_transpose_inv;
  90. fftw_complex *work; /* extra workspace, if needed */
  91. } fftwnd_mpi_plan_data;
  92. typedef fftwnd_mpi_plan_data *fftwnd_mpi_plan;
  93. typedef enum {
  94. FFTW_NORMAL_ORDER,
  95. FFTW_TRANSPOSED_ORDER
  96. } fftwnd_mpi_output_order;
  97. extern fftwnd_mpi_plan fftwnd_mpi_create_plan(MPI_Comm comm,
  98. int rank, const MKL_INT *n,
  99. fftw_direction dir,
  100. int flags);
  101. extern fftwnd_mpi_plan fftw2d_mpi_create_plan(MPI_Comm comm,
  102. MKL_INT nx, MKL_INT ny,
  103. fftw_direction dir, int flags);
  104. extern fftwnd_mpi_plan fftw3d_mpi_create_plan(MPI_Comm comm,
  105. MKL_INT nx, MKL_INT ny, MKL_INT nz,
  106. fftw_direction dir, int flags);
  107. extern void fftwnd_mpi_destroy_plan(fftwnd_mpi_plan p);
  108. extern void fftwnd_mpi_local_sizes(fftwnd_mpi_plan p,
  109. MKL_INT *local_nx,
  110. MKL_INT *local_x_start,
  111. MKL_INT *local_ny_after_transpose,
  112. MKL_INT *local_y_start_after_transpose,
  113. MKL_INT *total_local_size);
  114. extern void fftwnd_mpi(fftwnd_mpi_plan p,
  115. int n_fields,
  116. fftw_complex *local_data, fftw_complex *work,
  117. fftwnd_mpi_output_order output_order);
  118. extern void fftw_mpi_die(const char *error_string);
  119. /***********************************************************************/
  120. typedef struct fftw_mpi_twiddle_struct {
  121. int rows, rowstart, cols, n;
  122. fftw_complex *W;
  123. int refcount;
  124. struct fftw_mpi_twiddle_struct *next;
  125. } fftw_mpi_twiddle;
  126. typedef struct fftw_mpi_plan_struct {
  127. int n, m, r, local_m, local_m_start, local_r, local_r_start;
  128. fftw_complex *fft_work;
  129. fftw_mpi_twiddle *tw;
  130. transpose_mpi_plan p_transpose, p_transpose_inv;
  131. fftw_plan pm, pr;
  132. int flags;
  133. fftw_direction dir;
  134. } *fftw_mpi_plan;
  135. /* new flags for the MPI planner: */
  136. #define FFTW_SCRAMBLED_INPUT (8192)
  137. #define FFTW_SCRAMBLED_OUTPUT (16384)
  138. extern void fftw_mpi_local_sizes(fftw_mpi_plan p,
  139. MKL_INT *local_n,
  140. MKL_INT *local_start,
  141. MKL_INT *local_n_after_transform,
  142. MKL_INT *local_start_after_transform,
  143. MKL_INT *total_local_size);
  144. extern fftw_mpi_plan fftw_mpi_create_plan(MPI_Comm comm,
  145. MKL_INT n,
  146. fftw_direction dir, int flags);
  147. extern void fftw_mpi_destroy_plan(fftw_mpi_plan p);
  148. extern void fftw_mpi(fftw_mpi_plan p, int n_fields,
  149. fftw_complex *local_data, fftw_complex *work);
  150. extern void fftw_mpi_print_plan(fftw_mpi_plan p);
  151. /***********************************************************************/
  152. #ifdef __cplusplus
  153. } /* extern "C" */
  154. #endif /* __cplusplus */
  155. #endif /* FFTW_MPI_H */