22 for (
const auto& iter:
map) {
30 void alltoalldebug(
const char*
p,
int* s,
int* scnt,
int* sdispl,
int* r,
int* rcnt,
int* rdispl){
39 fprintf(f,
" s%d : %d %d :",
i, scnt[
i], sdispl[
i]);
40 for (
int j = sdispl[
i];
j < sdispl[
i+1]; ++
j) {
46 fprintf(f,
" r%d : %d %d :",
i, rcnt[
i], rdispl[
i]);
47 for (
int j = rdispl[
i];
j < rdispl[
i+1]; ++
j) {
56 void alltoalldebug(
const char*
p,
int* s,
int* scnt,
int* sdispl,
int* r,
int* rcnt,
int* rdispl) {}
84 for (
const auto& iter:
gid2in_) {
99 static void del(
int* a) {
109 int* x =
new int[size];
110 for (
int i = 0;
i < size; ++
i) {
117 int* aoff =
new int[size + 1];
119 for (
int i = 0;
i < size; ++
i) {
120 aoff[
i + 1] = aoff[
i] + acnt[
i];
144 #define all2allv_perf 0
147 all2allv_int(
int* s,
int* scnt,
int* sdispl,
int*& r,
int*& rcnt,
int*& rdispl,
const char* dmes) {
163 printf(
"all2allv_int %s space=%d total=%llu time=%g\n", dmes, nb,
nrn_mallinfo(0), tm);
172 virtual void alloc();
183 using Int2TarList = std::unordered_map<int, std::unique_ptr<TarList>>;
216 static int iran(
int i1,
int i2) {
230 n = int(
sqrt(
double(nt)));
237 for (
int i = 0;
i <
n; ++
i) {
245 for (
int i = 0;
i <
n; ++
i) {
249 int i3 =
iran(i1, i2);
250 int itar = tl->
list[i1];
288 for (
const auto& iter:
gid2in_) {
290 ps->bgp.srchost_ = 0;
308 for (
int i = 0;
i < sz;) {
317 ps->bgp.dma_send_phase2_ = bsp;
322 for (
int j = 0;
j < size; ++
j) {
342 for (
int j = 0;
j < size; ++
j) {
357 if (max_ntarget_host < bs->ntarget_hosts_) {
366 for (
const auto& iter:
gid2in_) {
369 if (bsp && max_multisend_targets < bsp->ntarget_hosts_phase2_) {
378 int *s, *r, *scnt, *rcnt, *sdispl, *rdispl;
391 for (
const auto& iter:
gid2in_) {
392 int gid = iter.first;
399 for (
const auto& iter:
gid2in_) {
400 int gid = iter.first;
401 s[sdispl[gid %
nhost]++] = gid;
407 all2allv_int(s, scnt, sdispl, r, rcnt, rdispl,
"gidin to intermediate");
416 for (
int i = 0;
i < rdispl[
nhost]; ++
i) {
417 const int gid = r[
i];
418 auto& tl = gid2tarlist[gid];
439 for (
auto& iter: gid2tarlist) {
440 TarList* tl = iter.second.get();
446 for (
int rank = 0; rank <
nhost; ++rank) {
447 int b = rdispl[rank];
448 int e = rdispl[rank + 1];
449 for (
int i = b;
i <
e; ++
i) {
450 const auto iter = gid2tarlist.find(r[
i]);
451 if (iter != gid2tarlist.end()) {
452 TarList* tl = iter->second.get();
475 int gid = iter.first;
486 int gid = iter.first;
488 s[sdispl[gid %
nhost]++] = gid;
494 all2allv_int(s, scnt, sdispl, r, rcnt, rdispl,
"gidout");
499 for (
int rank = 0; rank <
nhost; ++rank) {
500 int b = rdispl[rank];
501 int e = rdispl[rank + 1];
502 for (
int i = b;
i <
e; ++
i) {
508 const auto iter = gid2tarlist.find(r[
i]);
509 if (iter != gid2tarlist.end()) {
510 TarList* tl = iter->second.get();
524 for (
const auto& iter: gid2tarlist) {
525 TarList* tl = iter.second.get();
548 for (
const auto& iter: gid2tarlist) {
549 TarList* tl = iter.second.get();
565 for (
int i = 0;
i < tl->
size; ++
i) {
582 for (
const auto& iter: gid2tarlist) {
583 int gid = iter.first;
584 TarList* tl = iter.second.get();
589 s[sdispl[tl->
rank]++] = gid;
594 for (
int i = 0;
i < tl->
size; ++
i) {
597 for (
int i = 0;
i < tl->
size; ++
i) {
599 s[sdispl[rank]++] = gid;
602 for (
int j = tl->
indices[
i] + 1; j < tl->indices[
i + 1]; ++
j) {
603 s[sdispl[rank]++] = tl->
list[
j];
608 s[sdispl[tl->
rank]++] = gid;
613 for (
int i = 0;
i < tl->
size; ++
i) {
620 all2allv_int(s, scnt, sdispl, r, rcnt, rdispl,
"lists");
626 int sz = rdispl[
nhost];
static void nrnmpi_int_alltoallv(int *s, int *scnt, int *sdispl, int *r, int *rcnt, int *rdispl)
static int max_multisend_targets
void bgpdma_cleanup_presyn(PreSyn *ps)
#define NTARGET_HOSTS_PHASE1
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)
void alltoalldebug(const char *p, int *s, int *scnt, int *sdispl, int *r, int *rcnt, int *rdispl)
static int * newoffset(int *acnt, int size)
static int * newintval(int val, int size)
void celldebug(const char *p, Gid2PreSyn &map)
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 void setup_presyn_dma_lists()
static void fill_dma_send_lists(int, int *)
int * target_hosts_phase2_
int ntarget_hosts_phase2_
int ntarget_hosts_phase1_
sprintf(buf, " if (secondorder) {\n" " int _i;\n" " for (_i = 0; _i < %d; ++_i) {\n" " _p[_slist%d[_i]] += dt*_p[_dlist%d[_i]];\n" " }}\n", numeqn, listnum, listnum)
size_t nrn_mallinfo(int item)
static double map(void *v)
static double nrnmpi_wtime()
static Gid2PreSyn gid2out_
static Gid2PreSyn gid2in_
std::unordered_map< int, PreSyn * > Gid2PreSyn
int const size_t const size_t n
uint32_t nrnisaac_uint32_pick(void *v)
void * nrnisaac_new(void)
void nrnisaac_init(void *v, unsigned long int seed)
HOC interpreter function declarations (included by hocdec.h)
static double nhost(void *v)
static const char * fname(const char *name)