HILA
Loading...
Searching...
No Matches
fft.cpp
1/// Static variables and functions for hila fft routines
2
3
4#include "plumbing/defs.h"
5#include "plumbing/timing.h"
6#include "plumbing/fft.h"
7
8
9hila::timer fft_timer("FFT total time");
10hila::timer fft_plan_timer(" FFT plan");
11hila::timer pencil_MPI_timer(" MPI for pencils");
12hila::timer fft_execute_timer(" FFT execute");
13hila::timer pencil_reshuffle_timer(" pencil reshuffle");
14hila::timer fft_buffer_timer(" copy fft buffers");
15hila::timer pencil_collect_timer(" copy pencils");
16hila::timer pencil_save_timer(" save pencils");
17
18hila::timer binning_timer("bin field time");
19
20// a couple of global fft variables - easiest this way
21std::vector<pencil_struct> hila_pencil_comms[NDIM];
22unsigned hila_fft_my_columns[NDIM]; // how many columns does this node take care of
23size_t pencil_recv_buf_size[NDIM];
24
25// static variable to hold fft plans
26#if (defined(HIP) || defined(CUDA)) && !defined(HILAPP)
27hila_saved_fftplan_t hila_saved_fftplan;
28#endif
29
30// Delete saved plans if required - no-op for non-gpu
31void FFT_delete_plans() {
32#if (defined(HIP) || defined(CUDA)) && !defined(HILAPP)
33 hila_saved_fftplan.delete_plans();
34#endif
35}
36
37
38size_t pencil_get_buffer_offsets(const Direction dir, const size_t elements,
39 CoordinateVector &offset, CoordinateVector &nmin) {
40
41 offset[dir] = 1;
42 nmin = lattice->mynode.min;
43
44 size_t element_offset = lattice->mynode.size[dir];
45 size_t s = element_offset * elements;
46
47 foralldir(d) if (d != dir) {
48 offset[d] = s;
49 s *= lattice->mynode.size[d];
50 }
51
52 return element_offset;
53}
54
55/// THis is to be called before fft to Direction dir
56
57
58/////////////////////////////////////////////////////////////////////////////////////
59
60void init_pencil_direction(Direction dir) {
61
62 static lattice_struct *fftlat = nullptr;
63 if (fftlat == nullptr)
64 fftlat = lattice.ptr();
65 else if (fftlat != lattice.ptr()) {
66 hila::out0 << "FFT ERROR: different lattice size!\n";
68 }
69
70 if (hila_pencil_comms[dir].size() == 0) {
71 // basic structs not yet set, do it here
72
73 hila_pencil_comms[dir].resize(lattice->nodes.n_divisions[dir]);
74
75 int nodenumber = 0;
76 for (int nodenumber = 0; nodenumber < lattice->nodes.number; ++nodenumber) {
77
78 const node_info n = lattice->nodes.nodeinfo(nodenumber);
79
80 bool is_in_column = true;
81 foralldir(d) if (d != dir && n.min[d] != lattice->mynode.min[d]) {
82 is_in_column = false;
83 break; // breaks out of foralldir
84 }
85
86 // store the nodes in the hila_pencil_comms -list in the right order -
87 // nodes may be reordered by some weird layout
88 if (is_in_column) {
89 pencil_struct fn;
90 fn.node = nodenumber;
91 fn.size_to_dir = n.size[dir];
92 for (int i = 0; i < lattice->nodes.n_divisions[dir]; i++) {
93 if (n.min[dir] == lattice->nodes.divisors[dir][i]) {
94 hila_pencil_comms[dir].at(i) = fn;
95 }
96 }
97 }
98 }
99
100 size_t total_columns = lattice->mynode.volume / lattice->mynode.size[dir];
101
102 size_t nodes = hila_pencil_comms[dir].size();
103
104 // column offset and number are used for sending
105 size_t i = 0;
106 for (pencil_struct &fn : hila_pencil_comms[dir]) {
107 fn.column_offset = ((i * total_columns) / nodes) * lattice->mynode.size[dir];
108 fn.column_number =
109 (((i + 1) * total_columns) / nodes) - fn.column_offset / lattice->mynode.size[dir];
110
111 if (fn.node == hila::myrank()) {
112 hila_fft_my_columns[dir] = fn.column_number;
113 }
114 i++;
115 }
116
117 pencil_recv_buf_size[dir] = 0;
118
119 for (pencil_struct &fn : hila_pencil_comms[dir]) {
120 fn.recv_buf_size = hila_fft_my_columns[dir] * fn.size_to_dir;
121
122 // how big array?
123 if (fn.node != hila::myrank())
124 pencil_recv_buf_size[dir] += fn.recv_buf_size;
125 }
126
127 } // setup
128}
lattice_struct * ptr() const
get non-const pointer to lattice_struct (cf. operator ->)
Definition lattice.h:474
#define foralldir(d)
Macro to loop over (all) Direction(s)
Definition coordinates.h:80
Direction
Enumerator for direction that assigns integer to direction to be interpreted as unit vector.
Definition coordinates.h:34
This file defines all includes for HILA.
int myrank()
rank of this node
Definition com_mpi.cpp:237
std::ostream out0
This writes output only from main process (node 0)
void terminate(int status)
node_info nodeinfo(int i) const
Definition lattice.cpp:310
useful information about a node
Definition lattice.h:48