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) {
70 printf(
"%d |%s|\n", i, (*pargv)[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);
void nrnmpi_abort(int errcode)
int nrnmpi_numprocs_world
void nrnmusic_init(int *, char ***)
int const size_t const size_t n
void nrnmpi_init(int nrnmpi_under_nrncontrol, int *pargc, char ***pargv)
void nrnmusic_terminate()
MPI_Comm nrnmpi_world_comm