Changeset 27382


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

CHG: more deadlocking fix

Location:
issm/trunk-jpl/src/c/classes
Files:
2 edited

Legend:

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

    r27379 r27382  
    15891589        /*Now send and receive vector for nodes on partition edge*/
    15901590        IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs);
    1591         IssmDouble  *recv_buffer  = xNewZeroInit<IssmDouble>(this->nodes->Size());
     1591        IssmDouble  *recv_buffer  = xNewZeroInit<IssmDouble>(this->nodes->Size(),"t"); //only one alloc, "t" is required by adolc
    15921592        ISSM_MPI_Request  *send_requests = xNew<ISSM_MPI_Request>(num_procs);
    15931593        for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL;
  • issm/trunk-jpl/src/c/classes/Nodes.cpp

    r27381 r27382  
    272272
    273273        /* Share pids of masters and update pids of clones*/
    274         int* truepids = xNew<int>(this->Size()); //only one alloc
     274        int **send_truepids = xNewZeroInit<int*>(num_procs);
     275        int  *recv_truepids = xNewZeroInit<int>(this->Size());
     276        ISSM_MPI_Request* send_requests = xNew<ISSM_MPI_Request>(num_procs);
     277        for(int rank=0;rank<num_procs;rank++) send_requests[rank] = MPI_REQUEST_NULL;
    275278        for(int rank=0;rank<num_procs;rank++){
    276279                if(this->common_send[rank]){
    277280                        int  numids = this->common_send[rank];
     281                        send_truepids[rank] = xNew<int>(numids);
    278282                        for(int i=0;i<numids;i++){
    279283                                Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(this->common_send_ids[rank][i]));
    280                                 truepids[i] = node->pid;
    281                         }
    282                         ISSM_MPI_Send(truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm());
     284                                send_truepids[rank][i] = node->pid;
     285                        }
     286                        ISSM_MPI_Isend(send_truepids[rank],numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&send_requests[rank]);
    283287                }
    284288        }
     
    286290                if(this->common_recv[rank]){
    287291                        int  numids = this->common_recv[rank];
    288                         ISSM_MPI_Recv(truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&status);
     292                        ISSM_MPI_Recv(recv_truepids,numids,ISSM_MPI_INT,rank,0,IssmComm::GetComm(),&status);
    289293                        for(int i=0;i<numids;i++){
    290294                                Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(this->common_recv_ids[rank][i]));
    291                                 node->pid = truepids[i];
    292                         }
    293                 }
    294         }
    295         xDelete<int>(truepids);
     295                                node->pid = recv_truepids[i];
     296                        }
     297                }
     298        }
     299        xDelete<int>(recv_truepids);
     300        for(int rank=0;rank<num_procs;rank++){
     301                if(rank!=my_rank) ISSM_MPI_Wait(&send_requests[rank],&status);
     302                xDelete<int>(send_truepids[rank]);
     303        }
     304        xDelete<int*>(send_truepids);
     305        xDelete<ISSM_MPI_Request>(send_requests);
    296306
    297307        /*4. Distribute G dofs once for all*/
     
    494504
    495505        /*Now send and receive ug for nodes on partition edge*/
    496         #ifdef _HAVE_AD_
    497         IssmDouble* buffer = xNew<IssmDouble>(this->Size()*maxdofspernode,"t"); //only one alloc, "t" is required by adolc
    498         #else
    499         IssmDouble* buffer = xNew<IssmDouble>(this->Size()*maxdofspernode);
    500         #endif
     506        IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs);
     507        IssmDouble  *recv_buffer  = xNewZeroInit<IssmDouble>(this->Size()*maxdofspernode,"t");
     508        ISSM_MPI_Request  *send_requests = xNew<ISSM_MPI_Request>(num_procs);
     509        for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL;
     510
    501511        for(int rank=0;rank<num_procs;rank++){
    502512                if(this->common_send[rank]){
    503513                        int  numids = this->common_send[rank];
     514                        send_buffers[rank] = xNew<IssmDouble>(numids*maxdofspernode,"t"); //"t" is required by adolc
    504515                        for(int i=0;i<numids;i++){
    505516                                int   master_lid = this->common_send_ids[rank][i];
    506517                                Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(master_lid));
    507518                                _assert_(!node->IsClone());
    508                                 for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]];
    509                         }
    510                         ISSM_MPI_Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm());
     519                                for(int j=0;j<node->gsize;j++) send_buffers[rank][i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]];
     520                        }
     521                        ISSM_MPI_Isend(send_buffers[rank],numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&send_requests[rank]);
    511522                }
    512523        }
     
    514525                if(this->common_recv[rank]){
    515526                        int  numids = this->common_recv[rank];
    516                         ISSM_MPI_Recv(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status);
     527                        ISSM_MPI_Recv(recv_buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status);
    517528                        for(int i=0;i<numids;i++){
    518529                                int   master_lid = this->common_recv_ids[rank][i];
    519530                                Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(master_lid));
    520                                 for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j];
    521                         }
    522                 }
    523         }
    524         xDelete<IssmDouble>(buffer);
     531                                for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = recv_buffer[i*maxdofspernode+j];
     532                        }
     533                }
     534        }
     535
     536        xDelete<IssmDouble>(recv_buffer);
     537        for(int rank=0;rank<num_procs;rank++){
     538                if(rank!=my_rank) ISSM_MPI_Wait(&send_requests[rank],&status);
     539                xDelete<IssmDouble>(send_buffers[rank]);
     540        }
     541        xDelete<IssmDouble*>(send_buffers);
     542        xDelete<ISSM_MPI_Request>(send_requests);
    525543
    526544        /*Assign output pointer*/
Note: See TracChangeset for help on using the changeset viewer.