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);
78 scnt =
new int[
nhost];
82 for (
int i = 0;
i < size; ++
i) {
83 int r = (*rendezvous_rank)(
data[
i]);
96 for (
int i = 0;
i < size; ++
i) {
97 int r = (*rendezvous_rank)(
data[
i]);
98 sdata[sdispl[r] + scnt[r]] =
data[
i];
109 int*& send_to_want_cnt,
110 int*& send_to_want_displ,
112 int*& recv_from_have_cnt,
113 int*& recv_from_have_displ,
124 int *have_s_cnt, *have_s_displ, *have_r_cnt, *have_r_displ;
135 delete[] have_s_displ;
136 delete[] have_s_data;
140 for (
int r = 0; r <
nhost; ++r) {
141 for (
int i = 0;
i < have_r_cnt[r]; ++
i) {
143 if (havekey2rank.find(
key) != havekey2rank.end()) {
145 "internal error in have_to_want: key %lld owned by multiple ranks\n",
148 havekey2rank[
key] = r;
151 delete[] have_r_data;
153 delete[] have_r_displ;
156 int *want_s_cnt, *want_s_displ, *want_r_cnt, *want_r_displ;
171 int n = want_r_displ[
nhost];
172 int* want_r_ownerranks =
new int[
n];
173 for (
int r = 0; r <
nhost; ++r) {
174 for (
int i = 0;
i < want_r_cnt[r]; ++
i) {
175 int ix = want_r_displ[r] +
i;
177 auto search = havekey2rank.find(
key);
178 if (search == havekey2rank.end()) {
180 "internal error in have_to_want: key = %lld is wanted but does not exist\n",
183 want_r_ownerranks[ix] = search->second;
186 delete[] want_r_data;
193 int* want_s_ownerranks =
new int[want_s_displ[
nhost]];
195 nrnmpi_int_alltoallv_sparse(want_r_ownerranks,
210 delete[] want_r_ownerranks;
212 delete[] want_r_displ;
222 delete[] want_s_displ;
229 for (
int i = 0;
i <
n; ++
i) {
230 int r = want_s_ownerranks[
i];
237 for (
int i = 0;
i <
n; ++
i) {
238 int r = want_s_ownerranks[
i];
240 want_s_data[want_s_displ[r] + want_s_cnt[r]] =
key;
243 delete[] want_s_ownerranks;
244 delete[] old_want_s_data;
249 want_s_data, want_s_cnt, want_s_displ, want_r_data, want_r_cnt, want_r_displ);
253 send_to_want = want_r_data;
254 send_to_want_cnt = want_r_cnt;
255 send_to_want_displ = want_r_displ;
256 recv_from_have = want_s_data;
257 recv_from_have_cnt = want_s_cnt;
258 recv_from_have_displ = want_s_displ;
static void nrnmpi_int_alltoallv(int *s, int *scnt, int *sdispl, int *r, int *rcnt, int *rdispl)
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
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 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))
static int default_rendezvous(HAVEWANT_t key)
int const size_t const size_t n
static double nhost(void *v)
#define HAVEWANT_alltoallv