37 using Gid2IPS = std::map<int, InputPreSyn*>;
38 using Gid2PS = std::map<int, PreSyn*>;
42 static void celldebug(
const char*
p, T&
map) {
44 std::ofstream f(fname, std::ios::app);
45 f << std::endl <<
p << std::endl;
47 f <<
" " << std::setw(2) << std::setfill(
'0') << rank <<
":";
48 for (
const auto& m:
map) {
50 f <<
" " << std::setw(2) << std::setfill(
'0') << gid <<
":";
55 static void alltoalldebug(
const char*
p,
56 const std::vector<int>&
s,
57 const std::vector<int>& scnt,
58 const std::vector<int>& sdispl,
59 const std::vector<int>& r,
60 const std::vector<int>& rcnt,
61 const std::vector<int>& rdispl) {
63 std::ofstream f(fname, std::ios::app);
64 f << std::endl <<
p << std::endl;
66 f <<
" rank " << rank << std::endl;
68 f <<
" s" <<
i <<
" : " << scnt[
i] <<
" " << sdispl[
i] <<
" :";
69 for (
int j = sdispl[
i];
j < sdispl[
i + 1]; ++
j) {
70 f <<
" " << std::setw(2) << std::setfill(
'0') <<
s[
j] <<
":";
75 f <<
" r" <<
i <<
" : " << rcnt[
i] <<
" " << rdispl[
i] <<
" :";
76 for (
int j = rdispl[
i];
j < rdispl[
i + 1]; ++
j) {
77 f <<
" " << std::setw(2) << std::setfill(
'0') << r[
j] <<
":";
84 static void celldebug(
const char*, T&) {}
85 static void alltoalldebug(
const char*,
86 const std::vector<int>&,
87 const std::vector<int>&,
88 const std::vector<int>&,
89 const std::vector<int>&,
90 const std::vector<int>&,
91 const std::vector<int>&) {}
95 void phase1debug(
int* targets_phase1) {
97 std::ofstream f(fname, std::ios::app);
101 f << std::endl <<
" " << std::setw(2) << std::setfill(
'0') << ps->
gid_ <<
":";
102 int* ranks = targets_phase1 + ps->multisend_index_;
105 for (
int i = 0;
i <
n; ++
i) {
106 f <<
" " << std::setw(2) << std::setfill(
'0') << ranks[
i];
112 void phase2debug(
int* targets_phase2) {
114 std::ofstream f(fname, std::ios::app);
118 InputPreSyn* ps = g.second;
119 f << std::endl <<
" " << std::setw(2) << std::setfill(
'0') << gid <<
":";
120 int j = ps->multisend_phase2_index_;
122 int* ranks = targets_phase2 +
j;
125 for (
int i = 0;
i <
cnt; ++
i) {
126 f <<
" " << std::setw(2) << std::setfill(
'0') << ranks[
i];
134 static std::vector<int>
newoffset(
const std::vector<int>& acnt) {
135 std::vector<int> aoff(acnt.size() + 1);
137 std::partial_sum(acnt.begin(), acnt.end(), aoff.begin() + 1);
142 static std::pair<std::vector<int>, std::vector<int>>
all2allv_helper(
const std::vector<int>& scnt) {
144 std::vector<int>
c(
np, 1);
146 std::vector<int> rcnt(
np, 0);
148 scnt.data(),
c.data(), rdispl.data(), rcnt.data(),
c.data(), rdispl.data());
154 static std::pair<std::vector<int>, std::vector<int>>
all2allv_int(
const std::vector<int>&
s,
155 const std::vector<int>& scnt,
156 const std::vector<int>& sdispl,
160 std::vector<int> rcnt;
161 std::vector<int> rdispl;
163 std::vector<int> r(rdispl[
np], 0);
165 s.data(), scnt.data(), sdispl.data(), r.data(), rcnt.data(), rdispl.data());
166 alltoalldebug(dmes,
s, scnt, sdispl, r, rcnt, rdispl);
175 virtual void alloc();
193 , indices(nullptr) {}
221 static void random_delete() {
228 static int iran(
int i1,
int i2) {
240 int n = int(
sqrt(
double(nt)));
247 for (
int i = 0;
i <
n; ++
i) {
255 for (
int i = 0;
i <
n; ++
i) {
259 int i3 =
iran(i1, i2);
260 int itar = tl->
list[i1];
283 static void fill_multisend_lists(
bool,
const std::vector<int>&,
int*&,
int*&);
291 ps->multisend_index_ = -1;
296 InputPreSyn* ps = g.second;
297 ps->multisend_phase2_index_ = -1;
300 fill_multisend_lists(use_phase2, r, targets_phase1, targets_phase2);
310 static void fill_multisend_lists(
bool use_phase2,
311 const std::vector<int>& r,
312 int*& targets_phase1,
313 int*& targets_phase2) {
319 int phase1_index = 0;
320 int phase2_index = 0;
324 for (std::size_t
i = 0;
i < r.size();) {
325 InputPreSyn* ips =
nullptr;
329 auto gid2in_it =
gid2in.find(gid);
330 if (gid2in_it !=
gid2in.end()) {
331 ips = gid2in_it->second;
332 ips->multisend_phase2_index_ = phase2_index;
333 phase2_index += 1 + size;
338 auto gid2out_it =
gid2out.find(gid);
340 PreSyn* ps = gid2out_it->second;
341 ps->multisend_index_ = phase1_index;
342 phase1_index += 2 + size;
350 targets_phase1 =
new int[phase1_index];
351 targets_phase2 =
new int[phase2_index];
354 for (std::size_t
i = 0;
i < r.size();) {
355 InputPreSyn* ips =
nullptr;
359 auto gid2in_it =
gid2in.find(gid);
360 if (gid2in_it !=
gid2in.end()) {
361 ips = gid2in_it->second;
362 int p = ips->multisend_phase2_index_;
363 int* ranks = targets_phase2 +
p;
367 for (
int j = 0;
j < size; ++
j) {
375 auto gid2out_it =
gid2out.find(gid);
377 PreSyn* ps = gid2out_it->second;
378 int p = ps->multisend_index_;
379 int* ranks = targets_phase1 +
p;
388 for (
int j = 0;
j < size; ++
j) {
404 int i = ps->multisend_index_;
413 InputPreSyn* ps = g.second;
414 int i = ps->multisend_phase2_index_;
429 celldebug<Gid2PS>(
"output gid",
gid2out);
430 celldebug<Gid2IPS>(
"input gid",
gid2in);
439 std::vector<int> scnt1(
nhost, 0);
440 for (
const auto& g:
gid2in) {
442 ++scnt1[gid %
nhost];
446 const std::vector<int> sdispl1 =
newoffset(scnt1);
448 auto sdispl1_ = sdispl1;
449 std::vector<int> s1(sdispl1[
nhost], 0);
450 for (
const auto& g:
gid2in) {
452 s1[sdispl1_[gid %
nhost]++] = gid;
456 std::vector<int> rdispl1;
457 std::tie(r1, rdispl1) =
all2allv_int(s1, scnt1, sdispl1,
"gidin to intermediate");
461 for (
const auto& gid: r1) {
462 if (gid2tarlist.find(gid) == gid2tarlist.end()) {
463 gid2tarlist[gid] =
new TarList{};
464 gid2tarlist[gid]->
size = 0;
466 auto tar = gid2tarlist[gid];
484 for (
const auto& g: gid2tarlist) {
491 for (
int rank = 0; rank <
nhost; ++rank) {
492 int b = rdispl1[rank];
493 int e = rdispl1[rank + 1];
494 for (
int i = b;
i < e; ++
i) {
495 const auto itl_it = gid2tarlist.find(r1[
i]);
496 if (itl_it != gid2tarlist.end()) {
516 std::vector<int> scnt2(
nhost, 0);
521 ++scnt2[gid %
nhost];
525 auto sdispl2_ = sdispl2;
528 std::vector<int> s2(sdispl2[
nhost], 0);
533 s2[sdispl2_[gid %
nhost]++] = gid;
537 std::vector<int> rdispl2;
538 std::tie(r2, rdispl2) =
all2allv_int(s2, scnt2, sdispl2,
"gidout");
543 for (
int rank = 0; rank <
nhost; ++rank) {
544 int b = rdispl2[rank];
545 int e = rdispl2[rank + 1];
546 for (
int i = b;
i < e; ++
i) {
552 const auto itl_it = gid2tarlist.find(r2[
i]);
553 if (itl_it != gid2tarlist.end()) {
563 for (
const auto& gid2tar: gid2tarlist) {
585 std::vector<int> scnt3(
nhost, 0);
586 for (
const auto& gid2tar: gid2tarlist) {
603 for (
int i = 0;
i < tl->
size; ++
i) {
614 scnt3[tl->
rank] += 1;
618 auto sdispl4_ = sdispl4;
619 std::vector<int> s3(sdispl4[
nhost], 0);
621 for (
const auto& gid2tar: gid2tarlist) {
622 int gid = gid2tar.first;
628 s3[sdispl4_[tl->
rank]++] = gid;
629 s3[sdispl4_[tl->
rank]++] = tl->
size;
633 for (
int i = 0;
i < tl->
size; ++
i) {
636 for (
int i = 0;
i < tl->
size; ++
i) {
638 s3[sdispl4_[rank]++] = gid;
641 for (
int j = tl->
indices[
i] + 1; j < tl->indices[
i + 1]; ++
j) {
642 s3[sdispl4_[rank]++] = tl->
list[
j];
647 s3[sdispl4_[tl->
rank]++] = gid;
648 s3[sdispl4_[tl->
rank]++] = tl->
size;
650 s3[sdispl4_[tl->
rank]++] = tl->
size;
652 for (
int i = 0;
i < tl->
size; ++
i) {
658 std::vector<int> r_return;
659 std::vector<int> rdispl3;
660 std::tie(r_return, rdispl3) =
all2allv_int(s3, scnt3, sdispl4,
"lists");
static void nrnmpi_int_alltoallv(const int *s, const int *scnt, const int *sdispl, int *r, int *rcnt, int *rdispl)
std::uint32_t nrnran123_ipick(nrnran123_State *s)
nrnran123_State * nrnran123_newstream()
Construct a new Random123 stream based on the philox4x32 generator.
Function prototypes for the functions providing information about simulator memory usage.
static double map(void *v)
void move(Item *q1, Item *q2, Item *q3)
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
std::map< int, InputPreSyn * > gid2in
void nrnran123_deletestream(nrnran123_State *s, bool use_unified_memory)
void nrn_multisend_setup_targets(bool use_phase2, int *&targets_phase1, int *&targets_phase2)
std::map< int, PreSyn * > gid2out
Maps for ouput and input presyns.
std::string to_string(const T &obj)
int const size_t const size_t n
static int max_multisend_targets
static int max_ntarget_host
static void random_init(int i)
static int setup_target_lists(int **)
static unsigned int get_random()
static void all2allv_int(int *s, int *scnt, int *sdispl, int *&r, int *&rcnt, int *&rdispl, const char *dmes)
static int iran(int i1, int i2)
static nrnran123_State * ranstate
static int * newoffset(int *acnt, int size)
static void phase2organize(TarList *tl)
static void all2allv_helper(int *scnt, int *sdispl, int *&rcnt, int *&rdispl)
std::unordered_map< int, std::unique_ptr< TarList > > Int2TarList
static double nhost(void *v)