5#include "plumbing/timing.h"
13hila::timer pencil_reshuffle_timer(
" pencil reshuffle");
21std::vector<pencil_struct> hila_pencil_comms[NDIM];
22unsigned hila_fft_my_columns[NDIM];
23size_t pencil_recv_buf_size[NDIM];
26#if (defined(HIP) || defined(CUDA)) && !defined(HILAPP)
27hila_saved_fftplan_t hila_saved_fftplan;
31void FFT_delete_plans() {
32#if (defined(HIP) || defined(CUDA)) && !defined(HILAPP)
33 hila_saved_fftplan.delete_plans();
38size_t pencil_get_buffer_offsets(
const Direction dir,
const size_t elements,
42 nmin = lattice->mynode.min;
44 size_t element_offset = lattice->mynode.size[dir];
45 size_t s = element_offset * elements;
49 s *= lattice->mynode.size[d];
52 return element_offset;
63 if (fftlat ==
nullptr)
64 fftlat = lattice.
ptr();
65 else if (fftlat != lattice.
ptr()) {
66 hila::out0 <<
"FFT ERROR: different lattice size!\n";
70 if (hila_pencil_comms[dir].size() == 0) {
73 hila_pencil_comms[dir].resize(lattice->nodes.n_divisions[dir]);
76 for (
int nodenumber = 0; nodenumber < lattice->nodes.number; ++nodenumber) {
80 bool is_in_column =
true;
81 foralldir(d)
if (d != dir && n.min[d] != lattice->mynode.min[d]) {
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;
100 size_t total_columns = lattice->mynode.volume / lattice->mynode.size[dir];
102 size_t nodes = hila_pencil_comms[dir].size();
106 for (pencil_struct &fn : hila_pencil_comms[dir]) {
107 fn.column_offset = ((i * total_columns) / nodes) * lattice->mynode.size[dir];
109 (((i + 1) * total_columns) / nodes) - fn.column_offset / lattice->mynode.size[dir];
112 hila_fft_my_columns[dir] = fn.column_number;
117 pencil_recv_buf_size[dir] = 0;
119 for (pencil_struct &fn : hila_pencil_comms[dir]) {
120 fn.recv_buf_size = hila_fft_my_columns[dir] * fn.size_to_dir;
124 pencil_recv_buf_size[dir] += fn.recv_buf_size;
lattice_struct * ptr() const
get non-const pointer to lattice_struct (cf. operator ->)
#define foralldir(d)
Macro to loop over (all) Direction(s)
Direction
Enumerator for direction that assigns integer to direction to be interpreted as unit vector.
This file defines all includes for HILA.
int myrank()
rank of this node
std::ostream out0
This writes output only from main process (node 0)
void terminate(int status)
node_info nodeinfo(int i) const
useful information about a node