1 #include <../../nrnconf.h>
7 #include "nrnpthread.h"
10 #include <nrnmpiuse.h>
11 #if NRNMPI_DYNAMICLOAD
12 #include <nrnmpi_dynam.h>
19 #if NRNMPI_DYNAMICLOAD
21 #include "nrnmpi_def_cinc"
28 #define asrt(arg) nrn_assert(arg == MPI_SUCCESS)
43 MPI_Comm nrn_bbs_comm;
44 static MPI_Group grp_bbs;
45 static MPI_Group grp_net;
47 extern void nrnmpi_spike_initialize();
49 #define nrnmpidebugleak 0
51 extern void nrnmpi_checkbufleak();
54 static int nrnmpi_under_nrncontrol_;
55 static int nrnmpi_is_setup_;
58 extern "C" void nrnmpi_init(
int nrnmpi_under_nrncontrol,
int* pargc,
char*** pargv) {
64 nrnmpi_under_nrncontrol_ = nrnmpi_under_nrncontrol;
65 if (nrnmpi_under_nrncontrol_) {
68 printf(
"nrnmpi_init: argc=%d\n", *pargc);
69 for (
i=0;
i < *pargc; ++
i) {
79 #if !ALWAYS_CALL_MPI_INIT
88 for (
i = 0;
i < *pargc; ++
i) {
89 if (strncmp(
"-p4", (*pargv)[
i], 3) == 0) {
93 if (strcmp(
"-mpi", (*pargv)[
i]) == 0) {
98 if (nrnmpi_under_nrncontrol_ == 2) {
100 nrnmpi_under_nrncontrol_ = 1;
106 nrnmpi_under_nrncontrol_ = 0;
110 MPI_Initialized(&flag);
115 int required = MPI_THREAD_SERIALIZED;
117 asrt(MPI_Init_thread(pargc, pargv, required, &provided));
118 if (required > provided) {
119 nrn_cannot_use_threads_and_mpi = 1;
122 asrt(MPI_Init(pargc, pargv));
124 nrnmpi_under_nrncontrol_ = 1;
126 nrnmpi_under_nrncontrol_ = 0;
139 grp_bbs = MPI_GROUP_NULL;
140 grp_net = MPI_GROUP_NULL;
147 nrnmpi_spike_initialize();
156 printf(
"nrnmpi_init: argc=%d\n", *pargc);
157 for (
i=0;
i < *pargc; ++
i) {
158 printf(
"%d |%s|\n",
i, (*pargv)[
i]);
189 if (nrnmpi_under_nrncontrol_) {
199 nrnmpi_checkbufleak();
208 MPI_Initialized(&flag);
210 MPI_Abort(MPI_COMM_WORLD, errcode);
220 void nrnmpi_subworld_size(
int n) {
234 if (nrn_bbs_comm != MPI_COMM_NULL) {
235 asrt(MPI_Comm_free(&nrn_bbs_comm));
236 nrn_bbs_comm = MPI_COMM_NULL;
238 if (grp_bbs != MPI_GROUP_NULL) {
239 asrt(MPI_Group_free(&grp_bbs));
240 grp_bbs = MPI_GROUP_NULL;
242 if (grp_net != MPI_GROUP_NULL) {
243 asrt(MPI_Group_free(&grp_net));
244 grp_net = MPI_GROUP_NULL;
251 asrt(MPI_Group_incl(wg, 1, &r, &grp_net));
259 asrt(MPI_Group_incl(wg, 1, &r, &grp_bbs));
283 range[1] = range[0] +
n - 1;
284 if (range[1] >= nw) {
288 asrt(MPI_Group_range_incl(wg, 1, &range, &grp_net));
296 range[1] = (nb - 1) *
n;
298 asrt(MPI_Group_range_incl(wg, 1, &range, &grp_bbs));
313 asrt(MPI_Group_free(&wg));
317 int nrnmpi_wrap_mpi_init(
int* flag) {
318 return MPI_Initialized(flag);
int const size_t const size_t n
void nrnmpi_init(int nrnmpi_under_nrncontrol, int *pargc, char ***pargv)
void nrnmpi_abort(int errcode)
int nrnmpi_numprocs_world
MPI_Comm nrnmpi_world_comm
void nrnmusic_init(int *, char ***)
void nrnmusic_terminate()