31 static inline int index(
int ndim,
const int *
dims,
const int *
x)
34 for (
int i = 1; i < ndim; i++) {
35 idx = dims[i]*idx + x[i];
41 static inline bool advance_coords(
int ndim,
const int *
dims,
int *
x)
44 for (
int i = ndim-1; i >= 0; i--) {
45 if (x[i] < dims[i]-1) {
59 static bool cached =
false;
60 static char hostname[128];
63 gethostname(hostname, 128);
72 static unsigned long int rand_seed = 137;
83 const double twoneg48 = 0.35527136788005009e-14;
84 const unsigned long int m = 25214903917, a = 11, mask = 281474976710655;
85 rand_seed = (m * rand_seed + a) & mask;
86 return (twoneg48 * rand_seed);
104 for (
int i=0; i<ndim; i++) {
105 topo->
dims[i] = dims[i];
116 int rank = rank_from_coords(x, map_data);
117 topo->
ranks[index(ndim, dims, x)] = rank;
118 for (
int i=0; i<ndim; i++) {
119 topo->
coords[rank][i] = x[i];
121 }
while (advance_coords(ndim, dims, x));
125 for (
int i = 0; i < ndim; i++) {
130 rand_seed = 17*my_rank + 137;
164 return topo->
coords[rank];
174 static inline int mod(
int a,
int b)
176 return ((a % b) + b) % b;
184 coords[i] = (i < topo->
ndim) ?
206 errorQuda(
"Default topology has not been declared");
253 size_t blksize,
int nblocks,
size_t stride)
266 size_t blksize,
int nblocks,
size_t stride)
286 manual_set_partition[
dim] = 1;
292 return (manual_set_partition[dim] || (
comm_dim(dim) > 1));
const int * comm_dims(const Topology *topo)
MsgHandle * comm_declare_receive_displaced(void *buffer, const int displacement[], size_t nbytes)
int comm_dim_partitioned(int dim)
void comm_set_default_topology(Topology *topo)
MsgHandle * comm_declare_strided_receive_displaced(void *buffer, const int displacement[], size_t blksize, int nblocks, size_t stride)
char * comm_hostname(void)
int comm_ndim(const Topology *topo)
void comm_destroy_topology(Topology *topo)
int comm_rank_from_coords(const Topology *topo, const int *coords)
void comm_dim_partitioned_set(int dim)
MsgHandle * comm_declare_strided_send_displaced(void *buffer, const int displacement[], size_t blksize, int nblocks, size_t stride)
const int * comm_coords_from_rank(const Topology *topo, int rank)
MsgHandle * comm_declare_send_displaced(void *buffer, const int displacement[], size_t nbytes)
int my_coords[QUDA_MAX_DIM]
int(* coords)[QUDA_MAX_DIM]
MsgHandle * comm_declare_strided_send_relative(void *buffer, int dim, int dir, size_t blksize, int nblocks, size_t stride)
#define safe_malloc(size)
MsgHandle * comm_declare_strided_receive_relative(void *buffer, int dim, int dir, size_t blksize, int nblocks, size_t stride)
int comm_rank_displaced(const Topology *topo, const int displacement[])
const int * comm_coords(const Topology *topo)
MsgHandle * comm_declare_send_relative(void *buffer, int dim, int dir, size_t nbytes)
Topology * comm_create_topology(int ndim, const int *dims, QudaCommsMap rank_from_coords, void *map_data)
#define QUDA_MAX_DIM
Maximum number of dimensions supported by QUDA. In practice, no routines make use of more than 5...
int(* QudaCommsMap)(const int *coords, void *fdata)
Topology * comm_default_topology(void)
MsgHandle * comm_declare_receive_relative(void *buffer, int dim, int dir, size_t nbytes)