12 #include <nrnran123.h>
14 static void del(
int* a) {
24 int* x =
new int[size];
25 for (
int i = 0;
i < size; ++
i) {
32 int* aoff =
new int[size + 1];
34 for (
int i = 0;
i < size; ++
i) {
35 aoff[
i + 1] = aoff[
i] + acnt[
i];
55 all2allv_int(
int*
s,
int* scnt,
int* sdispl,
int*& r,
int*& rcnt,
int*& rdispl,
const char* dmes) {
78 using Int2TarList = std::unordered_map<int, std::unique_ptr<TarList>>;
109 static int iran(
int i1,
int i2) {
123 n = int(
sqrt(
double(nt)));
130 for (
int i = 0;
i <
n; ++
i) {
138 for (
int i = 0;
i <
n; ++
i) {
142 int i3 =
iran(i1, i2);
143 int itar = tl->
list[i1];
181 for (
const auto& iter:
gid2in_) {
183 ps->bgp.srchost_ = 0;
201 for (
int i = 0;
i < sz;) {
210 ps->bgp.multisend_send_phase2_ = bsp;
215 for (
int j = 0;
j < size; ++
j) {
235 for (
int j = 0;
j < size; ++
j) {
250 if (max_ntarget_host < bs->ntarget_hosts_) {
253 if (max_multisend_targets < bs->ntarget_hosts_phase1_) {
259 for (
const auto& iter:
gid2in_) {
262 if (bsp && max_multisend_targets < bsp->ntarget_hosts_phase2_) {
271 int *
s, *r, *scnt, *rcnt, *sdispl, *rdispl;
281 for (
const auto& iter:
gid2in_) {
282 int gid = iter.first;
289 for (
const auto& iter:
gid2in_) {
290 int gid = iter.first;
291 s[sdispl[gid %
nhost]++] = gid;
297 all2allv_int(
s, scnt, sdispl, r, rcnt, rdispl,
"gidin to intermediate");
306 for (
int i = 0;
i < rdispl[
nhost]; ++
i) {
307 const int gid = r[
i];
308 auto& tl = gid2tarlist[gid];
329 for (
auto& iter: gid2tarlist) {
330 TarList* tl = iter.second.get();
336 for (
int rank = 0; rank <
nhost; ++rank) {
337 int b = rdispl[rank];
338 int e = rdispl[rank + 1];
339 for (
int i = b;
i < e; ++
i) {
340 const auto iter = gid2tarlist.find(r[
i]);
341 if (iter != gid2tarlist.end()) {
342 TarList* tl = iter->second.get();
365 int gid = iter.first;
376 int gid = iter.first;
378 s[sdispl[gid %
nhost]++] = gid;
389 for (
int rank = 0; rank <
nhost; ++rank) {
390 int b = rdispl[rank];
391 int e = rdispl[rank + 1];
392 for (
int i = b;
i < e; ++
i) {
398 const auto iter = gid2tarlist.find(r[
i]);
399 if (iter != gid2tarlist.end()) {
400 TarList* tl = iter->second.get();
414 for (
const auto& iter: gid2tarlist) {
415 TarList* tl = iter.second.get();
438 for (
const auto& iter: gid2tarlist) {
439 TarList* tl = iter.second.get();
455 for (
int i = 0;
i < tl->
size; ++
i) {
472 for (
const auto& iter: gid2tarlist) {
473 int gid = iter.first;
474 TarList* tl = iter.second.get();
479 s[sdispl[tl->
rank]++] = gid;
484 for (
int i = 0;
i < tl->
size; ++
i) {
487 for (
int i = 0;
i < tl->
size; ++
i) {
489 s[sdispl[rank]++] = gid;
492 for (
int j = tl->
indices[
i] + 1; j < tl->indices[
i + 1]; ++
j) {
493 s[sdispl[rank]++] = tl->
list[
j];
498 s[sdispl[tl->
rank]++] = gid;
503 for (
int i = 0;
i < tl->
size; ++
i) {
516 int sz = rdispl[
nhost];
static void nrnmpi_int_alltoallv(const int *s, const int *scnt, const int *sdispl, int *r, int *rcnt, int *rdispl)
int * target_hosts_phase2_
int ntarget_hosts_phase2_
int ntarget_hosts_phase1_
std::uint32_t nrnran123_ipick(nrnran123_State *s)
nrnran123_State * nrnran123_newstream()
Construct a new Random123 stream based on the philox4x32 generator.
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status
int const size_t const size_t n
void nrn_multisend_cleanup_presyn(PreSyn *ps)
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 int * newintval(int val, 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 void setup_presyn_multisend_lists()
static void fill_multisend_send_lists(int, int *)
static Gid2PreSyn gid2out_
static Gid2PreSyn gid2in_
HOC interpreter function declarations (included by hocdec.h)
static double nhost(void *v)