Ignore:
Timestamp:
10/04/17 17:02:13 (7 years ago)
Author:
yushan
Message:

EP update part 2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_openmp/extern/src_ep_dev/ep_merge.cpp

    r1287 r1289  
    4242    if(local_ep_rank == 0) 
    4343    { 
    44       MPI_Status status[2]; 
    45       MPI_Request request[2]; 
    46       MPI_Isend(&local_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &request[0]); 
    47       MPI_Irecv(&remote_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &request[1]); 
    48  
    49       MPI_Waitall(2, request, status); 
     44      MPI_Status status; 
     45      MPI_Request req_s, req_r; 
     46      MPI_Isend(&local_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &req_s); 
     47      MPI_Irecv(&remote_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &req_r); 
     48 
     49      MPI_Wait(&req_s, &status); 
     50      MPI_Wait(&req_r, &status); 
    5051    } 
    5152 
     
    5354    MPI_Bcast(&remote_high, 1, MPI_INT, 0, *(inter_comm.ep_comm_ptr->intercomm->local_comm)); 
    5455 
     56//    printf("%d, %d, %d, %d\n", local_ep_size, remote_ep_size, local_high, remote_high); 
    5557 
    5658 
     
    8486    if(intra_ep_rank_loc == 0) 
    8587    { 
    86       ::MPI_Bcast(reorder, intra_ep_size, static_cast< ::MPI_Datatype> (MPI_INT), 0, static_cast< ::MPI_Comm>(newintracomm->mpi_comm)); 
     88      ::MPI_Bcast(reorder, intra_ep_size, MPI_INT, 0, static_cast< ::MPI_Comm>(newintracomm->mpi_comm)); 
    8789 
    8890      vector< pair<int, int> > tmp_rank_map(intra_ep_size); 
     
    128130    Debug("intercomm_merge kernel\n"); 
    129131 
    130     int ep_rank_loc; 
    131     int num_ep; 
    132  
     132    int ep_rank, ep_rank_loc, mpi_rank; 
     133    int ep_size, num_ep, mpi_size; 
     134 
     135    ep_rank = inter_comm.ep_comm_ptr->size_rank_info[0].first; 
    133136    ep_rank_loc = inter_comm.ep_comm_ptr->size_rank_info[1].first; 
     137    mpi_rank = inter_comm.ep_comm_ptr->size_rank_info[2].first; 
     138    ep_size = inter_comm.ep_comm_ptr->size_rank_info[0].second; 
    134139    num_ep = inter_comm.ep_comm_ptr->size_rank_info[1].second; 
    135  
    136  
     140    mpi_size = inter_comm.ep_comm_ptr->size_rank_info[2].second; 
     141 
     142 
     143    int local_ep_rank, local_ep_rank_loc, local_mpi_rank; 
     144    int local_ep_size, local_num_ep, local_mpi_size; 
     145 
     146 
     147    local_ep_rank = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[0].first; 
     148    local_ep_rank_loc = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].first; 
     149    local_mpi_rank = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[2].first; 
     150    local_ep_size = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[0].second; 
     151    local_num_ep = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].second; 
     152    local_mpi_size = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[2].second; 
    137153 
    138154    int remote_ep_size = inter_comm.ep_comm_ptr->intercomm->remote_rank_map->size(); 
    139155 
     156    int local_high = high; 
     157    int remote_high; 
    140158 
    141159    MPI_Barrier(inter_comm); 
     160 
     161//    if(local_ep_rank == 0 && high == false) 
     162//    { 
     163//      MPI_Status status; 
     164//      MPI_Send(&local_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm); 
     165//      MPI_Recv(&remote_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &status); 
     166//    } 
     167// 
     168//    if(local_ep_rank == 0 && high == true) 
     169//    { 
     170//      MPI_Status status; 
     171//      MPI_Recv(&remote_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &status); 
     172//      MPI_Send(&local_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm); 
     173//    } 
     174 
     175    if(local_ep_rank == 0) 
     176    { 
     177      MPI_Status status; 
     178      MPI_Request req_s, req_r; 
     179      MPI_Isend(&local_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &req_s); 
     180      MPI_Irecv(&remote_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &req_r); 
     181 
     182      MPI_Wait(&req_s, &status); 
     183      MPI_Wait(&req_r, &status); 
     184    } 
     185 
     186    MPI_Bcast(&remote_high, 1, MPI_INT, 0, *(inter_comm.ep_comm_ptr->intercomm->local_comm)); 
     187 
     188    int intercomm_high; 
     189    if(ep_rank == 0) intercomm_high = local_high; 
     190    MPI_Bcast(&intercomm_high, 1, MPI_INT, 0, inter_comm); 
     191 
     192    //printf("remote_ep_size = %d, local_high = %d, remote_high = %d, intercomm_high = %d\n", remote_ep_size, local_high, remote_high, intercomm_high); 
    142193 
    143194 
     
    150201      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm>(inter_comm.ep_comm_ptr->intercomm->mpi_inter_comm); 
    151202 
    152       ::MPI_Intercomm_merge(mpi_comm, high, &mpi_intracomm); 
     203      ::MPI_Intercomm_merge(mpi_comm, intercomm_high, &mpi_intracomm); 
    153204      MPI_Info info; 
    154205      MPI_Comm_create_endpoints(mpi_intracomm, num_ep, info, ep_intracomm); 
     
    158209    } 
    159210 
     211 
     212 
    160213    MPI_Barrier_local(inter_comm); 
    161214 
    162     int inter_rank; 
    163     MPI_Comm_rank(inter_comm, &inter_rank); 
    164      
    165     int my_ep_rank = high? inter_rank+remote_ep_size : inter_rank; 
    166     int my_ep_rank_loc = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].first; 
    167     int my_num_ep_loc = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].second; 
    168     int my_num_ep_total = inter_comm.ep_comm_ptr->comm_list->mem_bridge[0].ep_comm_ptr->size_rank_info[1].second; 
    169     int my_ep_size = inter_comm.ep_comm_ptr->comm_list->mem_bridge[0].ep_comm_ptr->size_rank_info[0].second; 
    170  
    171     int tmp_intra_ep_rank_loc = high?my_ep_rank_loc+my_num_ep_total-my_num_ep_loc: my_ep_rank_loc; 
    172  
    173  
    174     *newintracomm = inter_comm.ep_comm_ptr->comm_list->mem_bridge[tmp_intra_ep_rank_loc]; 
    175  
    176     int newintracomm_ep_rank = (*newintracomm).ep_comm_ptr->size_rank_info[0].first; 
    177     int newintracomm_ep_rank_loc = (*newintracomm).ep_comm_ptr->size_rank_info[1].first; 
    178     int newintracomm_mpi_rank = (*newintracomm).ep_comm_ptr->size_rank_info[2].first; 
    179     int newintracomm_ep_size = (*newintracomm).ep_comm_ptr->size_rank_info[0].second; 
    180     int newintracomm_num_ep = (*newintracomm).ep_comm_ptr->size_rank_info[1].second; 
    181     int newintracomm_mpi_size = (*newintracomm).ep_comm_ptr->size_rank_info[2].second; 
    182  
    183  
    184     int buf[3]; 
    185     buf[0] = my_ep_rank; 
    186     buf[1] = tmp_intra_ep_rank_loc; 
    187     buf[2] = newintracomm->ep_comm_ptr->size_rank_info[2].first; 
    188  
    189     // printf("my_ep_rank = %d, tmp_intra_ep_rank_loc = %d, mpi_rank = %d\n", my_ep_rank, tmp_intra_ep_rank_loc, newintracomm->ep_comm_ptr->size_rank_info[2].first); 
    190  
    191     int *rankmap_buf; 
    192     rankmap_buf = new int [3*my_ep_size]; 
    193  
    194     MPI_Allgather(buf, 3, MPI_INT, rankmap_buf, 3, MPI_INT, *newintracomm); 
    195  
    196      
    197     // printf(" ID = %d : rankmap_buf = (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d)\n", newintracomm_ep_rank, 
    198     //                     rankmap_buf[0], rankmap_buf[1], rankmap_buf[2], rankmap_buf[3], rankmap_buf[4], rankmap_buf[5], rankmap_buf[6], rankmap_buf[7], rankmap_buf[8], rankmap_buf[9], 
    199     //                     rankmap_buf[10], rankmap_buf[11], rankmap_buf[12], rankmap_buf[13], rankmap_buf[14], rankmap_buf[15], rankmap_buf[16], rankmap_buf[17], rankmap_buf[18], rankmap_buf[19],  
    200     //                     rankmap_buf[20], rankmap_buf[21], rankmap_buf[22], rankmap_buf[23], rankmap_buf[24], rankmap_buf[25], rankmap_buf[26], rankmap_buf[27], rankmap_buf[28], rankmap_buf[29], 
    201     //                     rankmap_buf[30], rankmap_buf[31], rankmap_buf[32], rankmap_buf[33], rankmap_buf[34], rankmap_buf[35], rankmap_buf[36], rankmap_buf[37], rankmap_buf[38], rankmap_buf[39], 
    202     //                     rankmap_buf[40], rankmap_buf[41], rankmap_buf[42], rankmap_buf[43], rankmap_buf[44], rankmap_buf[45], rankmap_buf[46], rankmap_buf[47]); 
    203  
    204  
    205     for(int i=0; i<newintracomm_ep_size; i++) 
    206     { 
    207       (*newintracomm).rank_map->at(rankmap_buf[3*i]).first  = rankmap_buf[3*i+1]; 
    208       (*newintracomm).rank_map->at(rankmap_buf[3*i]).second = rankmap_buf[3*i+2]; 
    209     } 
    210  
     215    *newintracomm = inter_comm.ep_comm_ptr->comm_list->mem_bridge[ep_rank_loc]; 
     216 
     217    int my_ep_rank = local_high<remote_high? local_ep_rank: local_ep_rank+remote_ep_size; 
     218 
     219    int intra_ep_rank, intra_ep_rank_loc, intra_mpi_rank; 
     220    int intra_ep_size, intra_num_ep, intra_mpi_size; 
     221 
     222    intra_ep_rank = newintracomm->ep_comm_ptr->size_rank_info[0].first; 
     223    intra_ep_rank_loc = newintracomm->ep_comm_ptr->size_rank_info[1].first; 
     224    intra_mpi_rank = newintracomm->ep_comm_ptr->size_rank_info[2].first; 
     225    intra_ep_size = newintracomm->ep_comm_ptr->size_rank_info[0].second; 
     226    intra_num_ep = newintracomm->ep_comm_ptr->size_rank_info[1].second; 
     227    intra_mpi_size = newintracomm->ep_comm_ptr->size_rank_info[2].second; 
     228 
     229 
     230 
     231    MPI_Barrier_local(*newintracomm); 
     232 
     233 
     234    int *reorder; 
     235    if(intra_ep_rank_loc == 0) 
     236    { 
     237      reorder = new int[intra_ep_size]; 
     238    } 
     239 
     240 
     241 
     242    MPI_Gather(&my_ep_rank, 1, MPI_INT, reorder, 1, MPI_INT, 0, *newintracomm); 
     243    if(intra_ep_rank_loc == 0) 
     244    { 
     245 
     246      ::MPI_Bcast(reorder, intra_ep_size, MPI_INT, 0, static_cast< ::MPI_Comm>(newintracomm->mpi_comm)); 
     247 
     248      vector< pair<int, int> > tmp_rank_map(intra_ep_size); 
     249 
     250 
     251      for(int i=0; i<intra_ep_size; i++) 
     252      { 
     253        tmp_rank_map[reorder[i]] = newintracomm->rank_map->at(i) ; 
     254      } 
     255 
     256      newintracomm->rank_map->swap(tmp_rank_map); 
     257 
     258      tmp_rank_map.clear(); 
     259    } 
     260 
     261    MPI_Barrier_local(*newintracomm); 
    211262 
    212263    (*newintracomm).ep_comm_ptr->size_rank_info[0].first = my_ep_rank; 
    213     (*newintracomm).ep_comm_ptr->size_rank_info[1].first = tmp_intra_ep_rank_loc; 
    214      
    215  
    216     delete[] rankmap_buf; 
    217  
    218      
     264 
     265 
     266    if(intra_ep_rank_loc == 0) 
     267    { 
     268      delete[] reorder; 
     269 
     270    } 
     271 
     272    /* 
     273    if(intra_ep_rank == 0) 
     274    { 
     275      for(int i=0; i<intra_ep_size; i++) 
     276      { 
     277        printf("intra rank_map[%d] = (%d, %d)\n", i, newintracomm->rank_map->at(i).first, newintracomm->rank_map->at(i).second); 
     278      } 
     279    } 
     280*/ 
    219281    return MPI_SUCCESS; 
    220282 
Note: See TracChangeset for help on using the changeset viewer.