471 if (lwidth == 0 && uwidth == 0)
return;
479 _XMP_fatal(
"reflect width is larger than shadow width.");
487 if (ni->
size == 1 && !is_periodic)
return;
489 int ndims = adesc->
dim;
492 int my_pos = ni->
rank;
496 int lo_pos = (my_pos == lb_pos) ? ub_pos : my_pos - 1;
497 int hi_pos = (my_pos == ub_pos) ? lb_pos : my_pos + 1;
502 int lo_rank = my_rank + (lo_pos - my_pos) * ni->
multiplier;
503 int hi_rank = my_rank + (hi_pos - my_pos) * ni->
multiplier;
505 int count = 0, blocklength = 0;
506 long long stride = 0;
511 void *lo_send_array = NULL, *lo_recv_array = NULL;
512 void *hi_send_array = NULL, *hi_recv_array = NULL;
514 void *lo_send_buf = NULL;
515 void *lo_recv_buf = NULL;
516 void *hi_send_buf = NULL;
517 void *hi_recv_buf = NULL;
526 if ((adesc->
order == MPI_ORDER_FORTRAN && target_dim != ndims - 1) ||
527 (adesc->
order == MPI_ORDER_C && target_dim != 0)){
531 count = reflect->
count;
542 if (adesc->
order == MPI_ORDER_FORTRAN){
545 blocklength = type_size;
548 for (
int i = ndims - 2; i >= target_dim; i--){
552 for (
int i = 1; i <= target_dim; i++){
558 else if (adesc->
order == MPI_ORDER_C){
561 blocklength = type_size;
562 stride = ainfo[ndims-1].
alloc_size * type_size;
564 for (
int i = 1; i <= target_dim; i++){
568 for (
int i = ndims - 2; i >= target_dim; i--){
575 _XMP_fatal(
"cannot determin the base language.");
588 lo_send_array = array_addr;
589 lo_recv_array = array_addr;
591 for (
int i = 0; i < ndims; i++) {
593 int lb_send, lb_recv;
594 unsigned long long dim_acc;
596 if (i == target_dim) {
608 lo_send_array = (
void *)((
char *)lo_send_array + lb_send * dim_acc * type_size);
609 lo_recv_array = (
void *)((
char *)lo_recv_array + lb_recv * dim_acc * type_size);
619 hi_send_array = array_addr;
620 hi_recv_array = array_addr;
622 for (
int i = 0; i < ndims; i++) {
624 int lb_send, lb_recv;
625 unsigned long long dim_acc;
627 if (i == target_dim) {
639 hi_send_array = (
void *)((
char *)hi_send_array + lb_send * dim_acc * type_size);
640 hi_recv_array = (
void *)((
char *)hi_recv_array + lb_recv * dim_acc * type_size);
651 ((adesc->
order == MPI_ORDER_FORTRAN && target_dim == ndims - 1) ||
652 (adesc->
order == MPI_ORDER_C && target_dim == 0))){
666 lo_buf_size = lwidth * blocklength * count;
669 ((adesc->
order == MPI_ORDER_FORTRAN && target_dim == ndims - 1) ||
670 (adesc->
order == MPI_ORDER_C && target_dim == 0))){
671 lo_send_buf = lo_send_array;
672 lo_recv_buf = lo_recv_array;
678 _XMP_TEND2(xmptiming_.t_mem, xmptiming_.tdim_mem[target_dim], t0);
687 hi_buf_size = uwidth * blocklength * count;
690 ((adesc->
order == MPI_ORDER_FORTRAN && target_dim == ndims - 1) ||
691 (adesc->
order == MPI_ORDER_C && target_dim == 0))){
692 hi_send_buf = hi_send_array;
693 hi_recv_buf = hi_recv_array;
699 _XMP_TEND2(xmptiming_.t_mem, xmptiming_.tdim_mem[target_dim], t0);
708 reflect->
count = count;
730 if (!is_periodic && my_pos == lb_pos){
731 lo_rank = MPI_PROC_NULL;
734 if (!is_periodic && my_pos == ub_pos){
735 hi_rank = MPI_PROC_NULL;
753 if (reflect->
req_reduce[0] != MPI_REQUEST_NULL){
757 if (reflect->
req_reduce[1] != MPI_REQUEST_NULL){
761 MPI_Send_init(reflect->
lo_recv_buf, lo_buf_size, MPI_BYTE, src,
763 MPI_Recv_init(reflect->
lo_send_buf, lo_buf_size, MPI_BYTE, dst,
767 if (reflect->
req[0] != MPI_REQUEST_NULL){
768 MPI_Request_free(&reflect->
req[0]);
771 if (reflect->
req[1] != MPI_REQUEST_NULL){
772 MPI_Request_free(&reflect->
req[1]);
775 MPI_Recv_init(reflect->
lo_recv_buf, lo_buf_size, MPI_BYTE, src,
777 MPI_Send_init(reflect->
lo_send_buf, lo_buf_size, MPI_BYTE, dst,
793 if (reflect->
req_reduce[2] != MPI_REQUEST_NULL){
797 if (reflect->
req_reduce[3] != MPI_REQUEST_NULL){
801 MPI_Send_init(reflect->
hi_recv_buf, hi_buf_size, MPI_BYTE, src,
803 MPI_Recv_init(reflect->
hi_send_buf, hi_buf_size, MPI_BYTE, dst,
807 if (reflect->
req[2] != MPI_REQUEST_NULL){
808 MPI_Request_free(&reflect->
req[2]);
811 if (reflect->
req[3] != MPI_REQUEST_NULL){
812 MPI_Request_free(&reflect->
req[3]);
815 MPI_Recv_init(reflect->
hi_recv_buf, hi_buf_size, MPI_BYTE, src,
817 MPI_Send_init(reflect->
hi_send_buf, hi_buf_size, MPI_BYTE, dst,
int alloc_size
Definition: xmp_data_struct.h:212
int local_upper
Definition: xmp_data_struct.h:210
unsigned long long dim_acc
Definition: xmp_data_struct.h:242
_Bool is_shadow_comm_member
Definition: xmp_data_struct.h:195
int local_lower
Definition: xmp_data_struct.h:209
void * array_addr_p
Definition: xmp_data_struct.h:279
Definition: xmp_data_struct.h:31
int multiplier
Definition: xmp_data_struct.h:37
int comm_rank
Definition: xmp_data_struct.h:52
_XMP_comm_t * comm
Definition: xmp_data_struct.h:53
int prev_pcopy_sched_type
Definition: xmp_data_struct.h:123
MPI_Request req[4]
Definition: xmp_data_struct.h:131
_XMP_nodes_t * onto_nodes
Definition: xmp_data_struct.h:111
#define _XMP_N_MPI_TAG_REFLECT_LO
Definition: xmp_constant.h:11
#define _XMP_N_MPI_TAG_REFLECT_HI
Definition: xmp_constant.h:12
void _XMP_free(void *p)
Definition: xmp_util.c:37
void * _XMP_alloc(size_t size)
Definition: xmp_util.c:21
#define _XMP_TSTART(t0)
Definition: xmp_internal.h:747
#define _XMP_TEND2(t, tt, t0)
Definition: xmp_internal.h:749
int _XMP_get_owner_pos(_XMP_array_t *a, int dim, int index)
Definition: xmp_reflect.c:1688