9 #error "This implementation can only be included once" 43 #define HAVEWANT_t int 55 displ[
i+1] = displ[
i] + cnt[
i];
62 nrnmpi_int_alltoall(srccnt, destcnt, 1);
74 scnt =
new int[
nhost];
75 for (
int i=0;
i <
nhost; ++
i) { scnt[
i] = 0; }
76 for (
int i=0;
i < size; ++
i) {
77 int r = (*rendezvous_rank)(data[
i]);
87 for (
int i=0;
i <
nhost; ++
i) { scnt[
i] = 0; }
88 for (
int i=0;
i < size; ++
i) {
89 int r = (*rendezvous_rank)(data[
i]);
90 sdata[sdispl[r] + scnt[r]] = data[
i];
98 HAVEWANT_t* &send_to_want,
int* &send_to_want_cnt,
int* &send_to_want_displ,
99 HAVEWANT_t* &recv_from_have,
int* &recv_from_have_cnt,
int* &recv_from_have_displ,
111 int *have_s_cnt, *have_s_displ, *have_r_cnt, *have_r_displ;
113 have_s_data, have_s_cnt, have_s_displ,
114 have_r_data, have_r_cnt, have_r_displ,
117 delete [] have_s_cnt;
118 delete [] have_s_displ;
119 delete [] have_s_data;
123 for (
int r=0; r <
nhost; ++r) {
124 for (
int i=0;
i < have_r_cnt[r]; ++
i) {
126 if (havekey2rank.find(key) != havekey2rank.end()) {
127 hoc_execerr_ext(
"internal error in have_to_want: key %lld owned by multiple ranks\n", (
long long)key);
129 havekey2rank[
key] = r;
132 delete [] have_r_data;
133 delete [] have_r_cnt;
134 delete [] have_r_displ;
137 int *want_s_cnt, *want_s_displ, *want_r_cnt, *want_r_displ;
139 want_s_data, want_s_cnt, want_s_displ,
140 want_r_data, want_r_cnt, want_r_displ,
148 int n = want_r_displ[
nhost];
149 int* want_r_ownerranks =
new int[
n];
150 for (
int r=0; r <
nhost; ++r) {
151 for (
int i=0;
i < want_r_cnt[r]; ++
i) {
152 int ix = want_r_displ[r] +
i;
154 auto search = havekey2rank.find(key);
155 if (search == havekey2rank.end()) {
156 hoc_execerr_ext(
"internal error in have_to_want: key = %lld is wanted but does not exist\n", (
long long)key);
158 want_r_ownerranks[ix] = search->second;
161 delete [] want_r_data;
168 int* want_s_ownerranks =
new int[want_s_displ[
nhost]];
171 nrnmpi_int_alltoallv_sparse(want_r_ownerranks, want_r_cnt, want_r_displ,
172 want_s_ownerranks, want_s_cnt, want_s_displ);
177 want_s_ownerranks, want_s_cnt, want_s_displ);
180 delete [] want_r_ownerranks;
181 delete [] want_r_cnt;
182 delete [] want_r_displ;
191 n = want_s_displ[
nhost];
192 delete [] want_s_displ;
193 for (
int i=0;
i <
nhost; ++
i) { want_s_cnt[
i] = 0; }
197 for (
int i=0;
i <
n; ++
i) {
198 int r = want_s_ownerranks[
i];
202 for (
int i=0;
i <
nhost; ++
i) { want_s_cnt[
i] = 0; }
203 for (
int i=0;
i <
n; ++
i) {
204 int r = want_s_ownerranks[
i];
206 want_s_data[want_s_displ[r] + want_s_cnt[r]] =
key;
209 delete [] want_s_ownerranks;
210 delete [] old_want_s_data;
215 want_r_data, want_r_cnt, want_r_displ);
219 send_to_want = want_r_data;
220 send_to_want_cnt = want_r_cnt;
221 send_to_want_displ = want_r_displ;
222 recv_from_have = want_s_data;
223 recv_from_have_cnt = want_s_cnt;
224 recv_from_have_displ = want_s_displ;
static void rendezvous_rank_get(HAVEWANT_t *data, int size, HAVEWANT_t *&sdata, int *&scnt, int *&sdispl, HAVEWANT_t *&rdata, int *&rcnt, int *&rdispl, int(*rendezvous_rank)(HAVEWANT_t))
static int * cnt2displ(int *cnt)
static int * srccnt2destcnt(int *srccnt)
static double nhost(void *v)
static int default_rendezvous(HAVEWANT_t key)
static void have_to_want(HAVEWANT_t *have, int have_size, HAVEWANT_t *want, int want_size, HAVEWANT_t *&send_to_want, int *&send_to_want_cnt, int *&send_to_want_displ, HAVEWANT_t *&recv_from_have, int *&recv_from_have_cnt, int *&recv_from_have_displ, int(*rendezvous_rank)(HAVEWANT_t))
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
int const size_t const size_t n
static void nrnmpi_int_alltoallv(int *s, int *scnt, int *sdispl, int *r, int *rcnt, int *rdispl)
#define HAVEWANT_alltoallv