NEURON
nrnmpidec.h
Go to the documentation of this file.
1 /*
2 This file is processed by mkdynam.sh and so it is important that the prototypes
3 be of the form "type foo(type arg, ...)". Moreover, the * needs to be attached
4 to the type, e.g. `T*` is valid, but `T *` isn't.
5 */
6 
7 #pragma once
8 #include <nrnmpiuse.h>
9 #include <cstdint>
10 using longdbl = long double;
11 #if NRNMPI
12 #include <stdlib.h>
13 #include <string>
14 
15 /* from bbsmpipack.cpp */
16 typedef struct bbsmpibuf {
17  char* buf;
18  int size;
19  int pkposition;
20  int upkpos;
21  int keypos;
22  int refcount;
23 } bbsmpibuf;
24 
25 struct NRNMPI_Spike;
26 
27 namespace neuron::container {
28 struct MemoryStats;
29 struct MemoryUsage;
30 } // namespace neuron::container
31 
32 // olupton 2022-07-06: dynamic MPI needs to dlopen some of these (slightly
33 // redefined) symbol names, so keep C linkage for simplicity
34 extern "C" {
35 // clang-format off
36 extern bbsmpibuf* nrnmpi_newbuf(int size);
37 extern void nrnmpi_copy(bbsmpibuf* dest, bbsmpibuf* src);
38 extern void nrnmpi_ref(bbsmpibuf* buf);
39 extern void nrnmpi_unref(bbsmpibuf* buf);
40 
41 extern void nrnmpi_upkbegin(bbsmpibuf* buf);
42 extern char* nrnmpi_getkey(bbsmpibuf* buf);
43 extern int nrnmpi_getid(bbsmpibuf* buf);
44 extern int nrnmpi_upkint(bbsmpibuf* buf);
45 extern double nrnmpi_upkdouble(bbsmpibuf* buf);
46 extern void nrnmpi_upkvec(int n, double* x, bbsmpibuf* buf);
47 extern char* nrnmpi_upkstr(bbsmpibuf* buf);
48 extern char* nrnmpi_upkpickle(size_t* size, bbsmpibuf* buf);
49 
50 extern void nrnmpi_pkbegin(bbsmpibuf* buf);
51 extern void nrnmpi_enddata(bbsmpibuf* buf);
52 extern void nrnmpi_pkint(int i, bbsmpibuf* buf);
53 extern void nrnmpi_pkdouble(double x, bbsmpibuf* buf);
54 extern void nrnmpi_pkvec(int n, double* x, bbsmpibuf* buf);
55 extern void nrnmpi_pkstr(const char* s, bbsmpibuf* buf);
56 extern void nrnmpi_pkpickle(const char* s, size_t size, bbsmpibuf* buf);
57 
58 extern int nrnmpi_iprobe(int* size, int* tag, int* source);
59 extern void nrnmpi_probe(int* size, int* tag, int* source);
60 extern void nrnmpi_bbssend(int dest, int tag, bbsmpibuf* r);
61 extern int nrnmpi_bbsrecv(int source, bbsmpibuf* r);
62 extern int nrnmpi_bbssendrecv(int dest, int tag, bbsmpibuf* s, bbsmpibuf* r);
63 
64 /* from nrnmpi.cpp */
65 extern void nrnmpi_init(int nrnmpi_under_nrncontrol, int* pargc, char*** pargv);
66 extern int nrnmpi_wrap_mpi_init(int* flag);
67 extern double nrnmpi_wtime();
68 extern void nrnmpi_terminate();
69 extern void nrnmpi_abort(int errcode);
70 extern void nrnmpi_subworld_size(int n);
71 extern void nrnmpi_get_subworld_info(int* cnt, int* index, int* rank, int* numprocs, int* numprocs_world);
72 
73 /* from memory_usage.cpp */
74 extern void nrnmpi_memory_stats(neuron::container::MemoryStats& stats, neuron::container::MemoryUsage const& usage);
75 extern void nrnmpi_print_memory_stats(neuron::container::MemoryStats const& stats);
76 
77 /* from mpispike.cpp */
78 extern void nrnmpi_spike_initialize();
79 extern int nrnmpi_spike_exchange(int* ovfl, int* nout, int* nin, NRNMPI_Spike* spikeout, NRNMPI_Spike** spikein, int* icapacity_);
80 extern int nrnmpi_spike_exchange_compressed(int localgid_size, int ag_send_size, int ag_send_nspike, int* ovfl_capacity, int* ovfl, unsigned char* spfixout, unsigned char* spfixin, unsigned char** spfixin_ovfl, int* nin_);
81 extern double nrnmpi_mindelay(double maxdel);
82 extern int nrnmpi_int_allmax(int i);
83 extern void nrnmpi_int_gather(int* s, int* r, int cnt, int root);
84 extern void nrnmpi_int_gatherv(int* s, int scnt, int* r, int* rcnt, int* rdispl, int root);
85 extern void nrnmpi_char_gatherv(char* s, int scnt, char* r, int* rcnt, int* rdispl, int root);
86 extern void nrnmpi_int_scatter(int* s, int* r, int cnt, int root);
87 extern void nrnmpi_char_scatterv(char* s, int* scnt, int* sdispl, char* r, int rcnt, int root);
88 extern void nrnmpi_int_allgather(int* s, int* r, int n);
89 extern void nrnmpi_int_allgather_inplace(int* srcdest, int n);
90 extern void nrnmpi_int_allgatherv_inplace(int* srcdest, int* n, int* dspl);
91 extern void nrnmpi_int_allgatherv(int* s, int* r, int* n, int* dspl);
92 extern void nrnmpi_char_allgatherv(char* s, char* r, int* n, int* dspl);
93 extern void nrnmpi_int_alltoall(int* s, int* r, int n);
94 extern void nrnmpi_int_alltoallv(const int* s, const int* scnt, const int* sdispl, int* r, int* rcnt, int* rdispl);
95 extern void nrnmpi_int_alltoallv_sparse(int* s, int* scnt, int* sdispl, int* r, int* rcnt, int* rdispl);
96 extern void nrnmpi_long_allgatherv(int64_t* s, int64_t* r, int* n, int* dspl);
97 extern void nrnmpi_long_allgatherv_inplace(long* srcdest, int* n, int* dspl);
98 extern void nrnmpi_long_alltoallv(int64_t* s, int* scnt, int* sdispl, int64_t* r, int* rcnt, int* rdispl);
99 extern void nrnmpi_long_alltoallv_sparse(int64_t* s, int* scnt, int* sdispl, int64_t* r, int* rcnt, int* rdispl);
100 extern void nrnmpi_dbl_allgatherv(double* s, double* r, int* n, int* dspl);
101 extern void nrnmpi_dbl_allgatherv_inplace(double* srcdest, int* n, int* dspl);
102 extern void nrnmpi_dbl_alltoallv(const double* s, const int* scnt, const int* sdispl, double* r, int* rcnt, int* rdispl);
103 extern void nrnmpi_dbl_alltoallv_sparse(double* s, int* scnt, int* sdispl, double* r, int* rcnt, int* rdispl);
104 extern void nrnmpi_char_alltoallv(char* s, int* scnt, int* sdispl, char* r, int* rcnt, int* rdispl);
105 extern void nrnmpi_dbl_broadcast(double* buf, int cnt, int root);
106 extern void nrnmpi_int_broadcast(int* buf, int cnt, int root);
107 extern void nrnmpi_char_broadcast(char* buf, int cnt, int root);
108 extern void nrnmpi_str_broadcast_world(std::string& str, int root);
109 extern int nrnmpi_int_sum_reduce(int in);
110 extern void nrnmpi_assert_opstep(int opstep, double t);
111 extern double nrnmpi_dbl_allmin(double x);
112 extern int nrnmpi_pgvts_least(double* t, int* op, int* init);
113 extern void nrnmpi_send_doubles(double* pd, int cnt, int dest, int tag);
114 extern void nrnmpi_recv_doubles(double* pd, int cnt, int src, int tag);
115 extern void nrnmpi_postrecv_doubles(double* pd, int cnt, int src, int tag, void** request);
116 extern void nrnmpi_wait(void** request);
117 extern void nrnmpi_barrier();
118 extern double nrnmpi_dbl_allreduce(double x, int type);
119 
120 extern void nrnmpi_dbl_allreduce_vec(double* src, double* dest, int cnt, int type);
121 extern void nrnmpi_longdbl_allreduce_vec(longdbl* src, longdbl* dest, int cnt, int type);
122 extern void nrnmpi_long_allreduce_vec(long* src, long* dest, int cnt, int type);
123 
124 extern void nrnmpi_dbl_allgather(double* s, double* r, int n);
125 #if NRNMPI
126 extern void nrnmpi_multisend_comm();
127 extern void nrnmpi_multisend_multisend(NRNMPI_Spike* spk, int n, int* hosts);
129 extern int nrnmpi_multisend_conserve(int nsend, int nrecv);
130 #endif
131 // clang-format on
132 }
133 #endif
static void nrnmpi_dbl_alltoallv(const double *s, const int *scnt, const int *sdispl, double *r, int *rcnt, int *rdispl)
static void nrnmpi_dbl_allgatherv(double *s, double *r, int *n, int *dspl)
static void nrnmpi_int_allgather(int *s, int *r, int n)
static void nrnmpi_int_alltoallv(const int *s, const int *scnt, const int *sdispl, int *r, int *rcnt, int *rdispl)
static void nrnmpi_barrier()
static void nrnmpi_int_allgatherv(int *s, int *r, int *n, int *dspl)
static int nrnmpi_int_allmax(int x)
#define cnt
Definition: tqueue.hpp:44
#define i
Definition: md1redef.h:19
char buf[512]
Definition: init.cpp:13
void init()
Definition: init.cpp:141
static void nrnmpi_postrecv_doubles(double *, int, int, int, void **)
Definition: multisplit.cpp:44
static void nrnmpi_wait(void **)
Definition: multisplit.cpp:46
static double nrnmpi_wtime()
Definition: multisplit.cpp:48
static void nrnmpi_send_doubles(double *, int, int, int)
Definition: multisplit.cpp:45
void nrnmpi_spike_initialize()
Definition: mpispike.cpp:37
int root
Definition: cellorder.cpp:622
int const size_t const size_t n
Definition: nrngsl.h:10
s
Definition: multisend.cpp:521
void nrnmpi_multisend_comm()
int nrnmpi_multisend_single_advance(NRNMPI_Spike *)
void nrnmpi_multisend_multisend(NRNMPI_Spike *, int, int *)
int nrnmpi_multisend_conserve(int nsend, int nrecv)
static int * nin_
Definition: netpar.cpp:55
static int icapacity_
Definition: netpar.cpp:58
void nrnmpi_init(int nrnmpi_under_nrncontrol, int *pargc, char ***pargv)
Definition: nrnmpi.cpp:55
void nrnmpi_abort(int errcode)
Definition: nrnmpi.cpp:209
void nrnmpi_terminate()
Definition: nrnmpi.cpp:184
long double longdbl
Definition: nrnmpidec.h:10
short index
Definition: cabvars.h:11
short type
Definition: cabvars.h:10
static void nrnmpi_dbl_broadcast(double *, int, int)
Definition: ocbbs.cpp:44
static void nrnmpi_char_broadcast(char *, int, int)
Definition: ocbbs.cpp:43
static void nrnmpi_int_broadcast(int *, int, int)
Definition: ocbbs.cpp:42
Overall SoA datastructures related memory usage.