1 #include <../../nrnconf.h>
10 #if NRNMPI_DYNAMICLOAD
11 #include <nrnmpi_dynam.h>
18 #if NRNMPI_DYNAMICLOAD
20 #include "nrnmpi_def_cinc"
27 #define nrn_mpi_assert(arg) nrn_assert(arg == MPI_SUCCESS)
38 static MPI_Group grp_bbs;
39 static MPI_Group grp_net;
41 static int nrnmpi_numprocs_subworld = 1;
42 static int nrnmpi_subworld_id = -1;
43 static int nrnmpi_subworld_change_cnt = 0;
47 #define nrnmpidebugleak 0
49 extern void nrnmpi_checkbufleak();
55 extern "C" void nrnmpi_init(
int nrnmpi_under_nrncontrol,
int* pargc,
char*** pargv) {
65 printf(
"nrnmpi_init: argc=%d\n", *pargc);
66 for (
i=0;
i < *pargc; ++
i) {
76 #if !ALWAYS_CALL_MPI_INIT
85 for (
i = 0;
i < *pargc; ++
i) {
86 if (strncmp(
"-p4", (*pargv)[
i], 3) == 0) {
90 if (strcmp(
"-mpi", (*pargv)[
i]) == 0) {
109 MPI_Initialized(&flag);
113 #if (NRN_ENABLE_THREADS)
114 int required = MPI_THREAD_SERIALIZED;
116 nrn_mpi_assert(MPI_Init_thread(pargc, pargv, required, &provided));
117 if (required > provided) {
118 nrn_cannot_use_threads_and_mpi = 1;
121 nrn_mpi_assert(MPI_Init(pargc, pargv));
140 grp_bbs = MPI_GROUP_NULL;
141 grp_net = MPI_GROUP_NULL;
150 nrnmpi_subworld_change_cnt = 0;
151 nrnmpi_subworld_id = 0;
160 printf(
"nrnmpi_init: argc=%d\n", *pargc);
161 for (
i=0;
i < *pargc; ++
i) {
162 printf(
"%d |%s|\n",
i, (*pargv)[
i]);
203 nrnmpi_checkbufleak();
212 MPI_Initialized(&flag);
214 MPI_Abort(MPI_COMM_WORLD, errcode);
226 void nrnmpi_subworld_size(
int n) {
240 if (nrn_bbs_comm != MPI_COMM_NULL) {
241 nrn_mpi_assert(MPI_Comm_free(&nrn_bbs_comm));
242 nrn_bbs_comm = MPI_COMM_NULL;
244 if (grp_bbs != MPI_GROUP_NULL) {
245 nrn_mpi_assert(MPI_Group_free(&grp_bbs));
246 grp_bbs = MPI_GROUP_NULL;
248 if (grp_net != MPI_GROUP_NULL) {
249 nrn_mpi_assert(MPI_Group_free(&grp_net));
250 grp_net = MPI_GROUP_NULL;
257 nrn_mpi_assert(MPI_Group_incl(wg, 1, &r, &grp_net));
267 nrn_mpi_assert(MPI_Group_incl(wg, 1, &r, &grp_bbs));
279 nrnmpi_subworld_id = 0;
294 if (
range[1] >= nw) {
298 nrn_mpi_assert(MPI_Group_range_incl(wg, 1, &
range, &grp_net));
308 nrn_mpi_assert(MPI_Group_range_incl(wg, 1, &
range, &grp_bbs));
317 nrnmpi_subworld_id = r /
n;
318 nrnmpi_numprocs_subworld =
n;
319 if ((nw %
n != 0) && (nrnmpi_subworld_id == (nb - 1))) {
320 nrnmpi_numprocs_subworld = nw %
n;
323 nrnmpi_subworld_change_cnt++;
324 nrn_mpi_assert(MPI_Group_free(&wg));
328 int nrnmpi_wrap_mpi_init(
int* flag) {
329 return MPI_Initialized(flag);
332 void nrnmpi_get_subworld_info(
int*
cnt,
int*
index,
int* rank,
int* numprocs,
int* numprocs_world) {
333 *
cnt = nrnmpi_subworld_change_cnt;
334 *
index = nrnmpi_subworld_id;
336 *numprocs = nrnmpi_numprocs_subworld;
constexpr auto range(T &&iterable)
static bool nrnmpi_under_nrncontrol_
void nrnmpi_spike_initialize()
int const size_t const size_t n
void nrnmpi_init(int nrnmpi_under_nrncontrol, int *pargc, char ***pargv)
void nrnmpi_abort(int errcode)
MPI_Comm nrnmpi_world_comm
void nrnmusic_init(int *, char ***)
void nrnmusic_terminate()
int nrnmpi_numprocs_world