24 int n_neighbor_pe_send,
int *neighbor_pe_send,
int *sendbuf_index,
25 void *sendbuf,
int n_neighbor_pe_recv,
int *neighbor_pe_recv,
32 if (n_neighbor_pe_send > 0) {
35 if (request_send ==
NULL) {
41 if (status_send ==
NULL) {
46 if (n_neighbor_pe_recv > 0) {
49 if (request_recv ==
NULL) {
55 if (status_recv ==
NULL) {
62 int *_sendbuf = (
int *)sendbuf;
63 int *_recvbuf = (
int *)recvbuf;
66 for (i = 0; i < n_neighbor_pe_send; i++) {
68 sendbuf_index[i + 1] - sendbuf_index[i],
HECMW_INT,
69 neighbor_pe_send[i], 0, comm, &request_send[i]);
70 if (rtc != 0)
goto error;
74 for (i = 0; i < n_neighbor_pe_recv; i++) {
76 recvbuf_index[i + 1] - recvbuf_index[i],
HECMW_INT,
77 neighbor_pe_recv[i], 0, comm, &request_recv[i]);
78 if (rtc != 0)
goto error;
81 double *_sendbuf = (
double *)sendbuf;
82 double *_recvbuf = (
double *)recvbuf;
85 for (i = 0; i < n_neighbor_pe_send; i++) {
88 neighbor_pe_send[i], 0, comm, &request_send[i]);
89 if (rtc != 0)
goto error;
93 for (i = 0; i < n_neighbor_pe_recv; i++) {
96 neighbor_pe_recv[i], 0, comm, &request_recv[i]);
97 if (rtc != 0)
goto error;
100 char *_sendbuf = (
char *)sendbuf;
101 char *_recvbuf = (
char *)recvbuf;
104 for (i = 0; i < n_neighbor_pe_send; i++) {
106 sendbuf_index[i + 1] - sendbuf_index[i],
HECMW_CHAR,
107 neighbor_pe_send[i], 0, comm, &request_send[i]);
108 if (rtc != 0)
goto error;
112 for (i = 0; i < n_neighbor_pe_recv; i++) {
114 recvbuf_index[i + 1] - recvbuf_index[i],
HECMW_CHAR,
115 neighbor_pe_recv[i], 0, comm, &request_recv[i]);
116 if (rtc != 0)
goto error;
124 if (n_neighbor_pe_recv > 0) {
125 rtc =
HECMW_Waitall(n_neighbor_pe_recv, request_recv, status_recv);
126 if (rtc != 0)
goto error;
129 if (n_neighbor_pe_send > 0) {
130 rtc =
HECMW_Waitall(n_neighbor_pe_send, request_send, status_send);
131 if (rtc != 0)
goto error;
151 int *sendbuf_index,
void *sendbuf,
152 int *recvbuf_index,
void *recvbuf,
159 if (n_neighbor_pe > 0) {
162 if (request_send ==
NULL) {
168 if (status_send ==
NULL) {
174 if (request_recv ==
NULL) {
180 if (status_recv ==
NULL) {
187 int *_sendbuf = (
int *)sendbuf;
188 int *_recvbuf = (
int *)recvbuf;
191 for (i = 0; i < n_neighbor_pe; i++) {
193 sendbuf_index[i + 1] - sendbuf_index[i], datatype,
194 neighbor_pe[i], 0, comm, &request_send[i]);
195 if (rtc != 0)
goto error;
199 for (i = 0; i < n_neighbor_pe; i++) {
201 recvbuf_index[i + 1] - recvbuf_index[i], datatype,
202 neighbor_pe[i], 0, comm, &request_recv[i]);
203 if (rtc != 0)
goto error;
206 double *_sendbuf = (
double *)sendbuf;
207 double *_recvbuf = (
double *)recvbuf;
210 for (i = 0; i < n_neighbor_pe; i++) {
212 sendbuf_index[i + 1] - sendbuf_index[i], datatype,
213 neighbor_pe[i], 0, comm, &request_send[i]);
214 if (rtc != 0)
goto error;
218 for (i = 0; i < n_neighbor_pe; i++) {
220 recvbuf_index[i + 1] - recvbuf_index[i], datatype,
221 neighbor_pe[i], 0, comm, &request_recv[i]);
222 if (rtc != 0)
goto error;
225 char *_sendbuf = (
char *)sendbuf;
226 char *_recvbuf = (
char *)recvbuf;
229 for (i = 0; i < n_neighbor_pe; i++) {
231 sendbuf_index[i + 1] - sendbuf_index[i], datatype,
232 neighbor_pe[i], 0, comm, &request_send[i]);
233 if (rtc != 0)
goto error;
237 for (i = 0; i < n_neighbor_pe; i++) {
239 recvbuf_index[i + 1] - recvbuf_index[i], datatype,
240 neighbor_pe[i], 0, comm, &request_recv[i]);
241 if (rtc != 0)
goto error;
249 if (n_neighbor_pe > 0) {
250 rtc =
HECMW_Waitall(n_neighbor_pe, request_recv, status_recv);
251 if (rtc != 0)
goto error;
254 if (n_neighbor_pe > 0) {
255 rtc =
HECMW_Waitall(n_neighbor_pe, request_send, status_send);
256 if (rtc != 0)
goto error;
276 int sendbuf_size,
void *sendbuf,
277 int n_neighbor_pe_recv,
int *neighbor_pe_recv,
278 int *recvbuf_index,
void *recvbuf,
284 if (n_neighbor_pe_send > 0) {
287 if (request_send ==
NULL) {
293 if (status_send ==
NULL) {
298 if (n_neighbor_pe_recv > 0) {
301 if (request_recv ==
NULL) {
307 if (status_recv ==
NULL) {
314 int *_sendbuf = (
int *)sendbuf;
315 int *_recvbuf = (
int *)recvbuf;
318 for (i = 0; i < n_neighbor_pe_send; i++) {
319 rtc =
HECMW_Isend(&_sendbuf[0], sendbuf_size, datatype,
320 neighbor_pe_send[i], 0, comm, &request_send[i]);
321 if (rtc != 0)
goto error;
325 for (i = 0; i < n_neighbor_pe_recv; i++) {
327 recvbuf_index[i + 1] - recvbuf_index[i], datatype,
328 neighbor_pe_recv[i], 0, comm, &request_recv[i]);
329 if (rtc != 0)
goto error;
332 double *_sendbuf = (
double *)sendbuf;
333 double *_recvbuf = (
double *)recvbuf;
336 for (i = 0; i < n_neighbor_pe_send; i++) {
337 rtc =
HECMW_Isend(&_sendbuf[0], sendbuf_size, datatype,
338 neighbor_pe_send[i], 0, comm, &request_send[i]);
339 if (rtc != 0)
goto error;
343 for (i = 0; i < n_neighbor_pe_recv; i++) {
345 recvbuf_index[i + 1] - recvbuf_index[i], datatype,
346 neighbor_pe_recv[i], 0, comm, &request_recv[i]);
347 if (rtc != 0)
goto error;
350 char *_sendbuf = (
char *)sendbuf;
351 char *_recvbuf = (
char *)recvbuf;
354 for (i = 0; i < n_neighbor_pe_send; i++) {
355 rtc =
HECMW_Isend(&_sendbuf[0], sendbuf_size, datatype,
356 neighbor_pe_send[i], 0, comm, &request_send[i]);
357 if (rtc != 0)
goto error;
361 for (i = 0; i < n_neighbor_pe_recv; i++) {
363 recvbuf_index[i + 1] - recvbuf_index[i], datatype,
364 neighbor_pe_recv[i], 0, comm, &request_recv[i]);
365 if (rtc != 0)
goto error;
373 if (n_neighbor_pe_recv > 0) {
374 rtc =
HECMW_Waitall(n_neighbor_pe_recv, request_recv, status_recv);
375 if (rtc != 0)
goto error;
377 if (n_neighbor_pe_send > 0) {
378 rtc =
HECMW_Waitall(n_neighbor_pe_send, request_send, status_send);
379 if (rtc != 0)
goto error;
403 int n_pe_send = 0, n_pe_recv = 0, *pe_send =
NULL, *pe_recv =
NULL;
404 int *sendbuf_index =
NULL, *recvbuf_index =
NULL, *sendbuf =
NULL, *recvbuf =
NULL;
411 if(pe_send ==
NULL) {
415 pe_send[0] = comm_dst->
root;
417 sendbuf_index = (
int *)
HECMW_calloc(n_pe_send+1,
sizeof(
int));
418 if(sendbuf_index ==
NULL) {
422 sendbuf_index[1] = count;
424 sendbuf = (
int *)
HECMW_malloc(
sizeof(
int)*sendbuf_index[1]);
425 if(sendbuf ==
NULL) {
429 for(i=0; i<sendbuf_index[1]; i++) {
430 sendbuf[i] = buffer[i];
438 if(pe_recv ==
NULL) {
442 pe_recv[0] = comm_src->
root;
444 recvbuf_index = (
int *)
HECMW_calloc(n_pe_recv+1,
sizeof(
int));
445 if(recvbuf_index ==
NULL) {
449 recvbuf_index[1] = count;
451 recvbuf = (
int *)
HECMW_malloc(
sizeof(
int)*recvbuf_index[1]);
452 if(recvbuf ==
NULL) {
463 memcpy(buffer, recvbuf, size);
488 void **recvbuf,
int recvcount,
HECMW_Datatype datatype,
int direction)
505 if(comm_src ==
NULL || comm_dst ==
NULL)
goto error;
508 int n_src = 0, n_dst = 0, *src =
NULL, *dst =
NULL;
509 int *_sendbuf = (
int *)sendbuf;
510 int *sendindex =
NULL, *recvindex =
NULL;
511 int _recvcount, *_recvbuf =
NULL;
521 dst[0] = comm_dst->root;
524 if(sendindex ==
NULL) {
531 _sendbuf = (
int *)
HECMW_malloc(
sizeof(
int)*sendindex[n_dst]);
532 if(_sendbuf ==
NULL) {
536 _sendbuf[0] = sendcount;
539 if(comm_dst->is_root) {
547 src[0] = comm_src->
root;
550 if(recvindex ==
NULL) {
557 _recvbuf = (
int *)
HECMW_malloc(
sizeof(
int)*recvindex[n_src]);
558 if(_recvbuf ==
NULL) {
565 n_src, src, recvindex, _recvbuf,
HECMW_INT, intercomm->comm);
568 if(comm_dst->is_root) {
569 recvcount = _recvbuf[0];
590 dst[0] = comm_dst->root;
593 if(sendindex ==
NULL) {
597 sendindex[1] = sendcount;
599 _sendbuf = (
int *)
HECMW_malloc(
sizeof(
int)*sendindex[n_dst]+1);
600 if(_sendbuf ==
NULL) {
604 for(i=0; i<sendindex[n_dst]; i++) {
605 _sendbuf[i] = sendbuf[i];
609 if(comm_dst->is_root) {
617 src[0] = comm_src->
root;
620 if(recvindex ==
NULL) {
624 recvindex[1] = recvcount;
626 _recvbuf = (
int *)
HECMW_malloc(
sizeof(
int)*recvindex[n_src]);
627 if(_recvbuf ==
NULL) {
634 n_src, src, recvindex, _recvbuf,
HECMW_INT, intercomm->comm);
637 if(comm_dst->is_member) {
641 if(recvbuf ==
NULL) {
646 if(comm_dst->is_root) {
647 for(i=0; i<recvcount; i++) {
648 recvbuf[i] = _recvbuf[i];