Changeset 27383


Ignore:
Timestamp:
11/10/22 17:25:21 (2 years ago)
Author:
Mathieu Morlighem
Message:

CHG: added more deadlock fix, all done with Daniel's patch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Vertices.cpp

    r27102 r27383  
    235235
    236236        /* Share pids of masters and update pids of clones*/
    237         int* truepids = xNew<int>(this->Size()); //only one alloc
     237        int **send_truepids = xNewZeroInit<int*>(num_procs);
     238        int  *recv_truepids = xNewZeroInit<int>(this->Size());
     239        ISSM_MPI_Request* send_requests = xNew<ISSM_MPI_Request>(num_procs);
     240        for(int rank=0;rank<num_procs;rank++) send_requests[rank] = MPI_REQUEST_NULL;
    238241        for(int rank=0;rank<num_procs;rank++){
    239242                if(this->common_send[rank]){
    240243                        int  numids = this->common_send[rank];
     244                        send_truepids[rank] = xNew<int>(numids);
    241245                        for(int i=0;i<numids;i++){
    242246                                Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(this->common_send_ids[rank][i]));
    243                                 truepids[i] = vertex->pid;
     247                                send_truepids[rank][i] = vertex->pid;
    244248                        }
    245                         ISSM_MPI_Send(truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm());
     249                        ISSM_MPI_Isend(send_truepids[rank],numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&send_requests[rank]);
    246250                }
    247251        }
     
    249253                if(this->common_recv[rank]){
    250254                        int  numids = this->common_recv[rank];
    251                         ISSM_MPI_Recv(truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&status);
     255                        ISSM_MPI_Recv(recv_truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&status);
    252256                        for(int i=0;i<numids;i++){
    253257                                Vertex* vertex=xDynamicCast<Vertex*>(this->GetObjectByOffset(this->common_recv_ids[rank][i]));
    254                                 vertex->pid = truepids[i];
     258                                vertex->pid = recv_truepids[i];
    255259                        }
    256260                }
    257261        }
    258         xDelete<int>(truepids);
     262        xDelete<int>(recv_truepids);
     263        for(int rank=0;rank<num_procs;rank++){
     264                if(rank!=my_rank) ISSM_MPI_Wait(&send_requests[rank],&status);
     265                xDelete<int>(send_truepids[rank]);
     266        }
     267        xDelete<int*>(send_truepids);
     268        xDelete<ISSM_MPI_Request>(send_requests);
    259269}/*}}}*/
    260270int Vertices::NumberOfVertices(){/*{{{*/
Note: See TracChangeset for help on using the changeset viewer.