void _XMP_reflect_init_gpu(void *dev_addr,_XMP_array_t *a) { _XMP_RETURN_IF_SINGLE; static char isFlagSetted = 0; if(! isFlagSetted ){ char *mode_str = getenv("XACC_COMM_MODE"); if(mode_str != NULL){ int mode = atoi(mode_str); switch(mode){ default: case 0: packVector = 1; useHostBuffer = 1; break; case 1: packVector = 1; useHostBuffer = 0; break; case 2: packVector = 0; useHostBuffer = 0; break; } } isFlagSetted = 1; } //printf("reflect mode (%d, %d)\n", packVector, useHostBuffer); if (!a->is_allocated){ _xmpf_set_reflect_flag = 0; return; } if (!_xmpf_set_reflect_flag){ for (int i = 0; i < a->dim; i++){ _XMP_array_info_t *ai = &(a->info[i]); _xmp_lwidth[i] = ai->shadow_size_lo; _xmp_uwidth[i] = ai->shadow_size_hi; _xmp_is_periodic[i] = 0; } } _XMP_reflect_sched(a, _xmp_lwidth, _xmp_uwidth, _xmp_is_periodic, 0, dev_addr); _xmpf_set_reflect_flag = 0; for (int i = 0; i < a->dim; i++){ _xmp_lwidth[i] = 0; _xmp_uwidth[i] = 0; _xmp_is_periodic[i] = 0; } }
void _XMP_reflect_async__(_XMP_array_t *a, int async_id) { if (!a->is_allocated){ _xmp_set_reflect_flag = 0; return; } if (!_xmp_set_reflect_flag){ for (int i = 0; i < a->dim; i++){ _XMP_array_info_t *ai = &(a->info[i]); _xmp_lwidth[i] = ai->shadow_size_lo; _xmp_uwidth[i] = ai->shadow_size_hi; _xmp_is_periodic[i] = 0; } } _XMP_reflect_sched(a, _xmp_lwidth, _xmp_uwidth, _xmp_is_periodic, 1); _XMP_reflect_start(a, _xmp_lwidth, _xmp_uwidth, _xmp_is_periodic, async_id); _XMP_async_comm_t *async = _XMP_get_current_async(); _XMP_free(async->reqs); async->reqs = NULL; // reqs not needed in RDMA reflects. for (int i = 0; i < a->dim; i++){ _XMP_reflect_sched_t *reflect = a->info[i].reflect_sched; if (_xmp_lwidth[i] && reflect->hi_rank != -1) async->nreqs += reflect->count; if (_xmp_uwidth[i] && reflect->lo_rank != -1) async->nreqs += reflect->count; } _xmp_set_reflect_flag = 0; for (int i = 0; i < a->dim; i++){ _xmp_lwidth[i] = 0; _xmp_uwidth[i] = 0; _xmp_is_periodic[i] = 0; } }