Changeset 23641


Ignore:
Timestamp:
01/17/19 12:00:34 (6 years ago)
Author:
Mathieu Morlighem
Message:

CHG: speeding up allocation without MPI_Allreduce

Location:
issm/trunk-jpl/src/c
Files:
5 edited

Legend:

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

    r23640 r23641  
    623623}
    624624/*}}}*/
     625int  Node::Pid(void){/*{{{*/
     626        return this->pid;
     627}
     628/*}}}*/
    625629
    626630/*Node numerics:*/
  • issm/trunk-jpl/src/c/classes/Node.h

    r23640 r23641  
    108108                void  ShowMasterDofs(int* truerows,int setenum);
    109109                int   Sid(void);
     110                int   Pid(void);
    110111                void  UpdateCloneDofs(int* alltruerows,int setenum);
    111112                void  VecMerge(Vector<IssmDouble>* ug,IssmDouble* local_uf,int* indices_uf,IssmDouble* local_ys,int* indices_ys);
  • issm/trunk-jpl/src/c/classes/Nodes.cpp

    r23640 r23641  
    360360}
    361361/*}}}*/
     362int   Nodes::NumberOfNodesLocal(void){/*{{{*/
     363
     364        return this->numberofmasters_local;
     365}
     366/*}}}*/
    362367bool  Nodes::RequiresDofReindexing(void){/*{{{*/
    363368
  • issm/trunk-jpl/src/c/classes/Nodes.h

    r23640 r23641  
    4444                int   NumberOfDofsLocalAll(int setenum);
    4545                int   NumberOfNodes(void);
     46                int   NumberOfNodesLocal(void);
    4647                bool  RequiresDofReindexing(void);
    4748};
  • issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp

    r23612 r23641  
    108108        /*Get vector size and number of nodes*/
    109109        int numnodes            = femmodel->nodes->NumberOfNodes();
     110        int localmasters        = femmodel->nodes->NumberOfNodesLocal();
    110111        int localnumnodes       = femmodel->nodes->Size();
    111112        int numberofdofspernode = femmodel->nodes->MaxNumDofs(GsetEnum);
     
    171172        bool *flags                  = xNew<bool>(localnumnodes);
    172173        int  *flagsindices           = xNew<int>(localnumnodes);
    173         int  *d_connectivity         = xNewZeroInit<int>(numnodes);
    174         int  *o_connectivity         = xNewZeroInit<int>(numnodes);
    175         int  *connectivity_clone     = xNewZeroInit<int>(numnodes);
     174        int  *d_connectivity         = xNewZeroInit<int>(localnumnodes);
     175        int  *o_connectivity         = xNewZeroInit<int>(localnumnodes);
    176176        int  *all_connectivity_clone = xNewZeroInit<int>(numnodes);
     177
     178        Vector<IssmDouble> *connectivity_clone= new Vector<IssmDouble>(localmasters,numnodes);
    177179
    178180        /*Resetting flags to false at eahc iteration takes a lot of time, so we keep track of the flags
     
    209211                        element->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,flagsindices,set1enum,set2enum);
    210212                        if(node->IsClone()){
    211                                 connectivity_clone[node->Sid()]+=d_nz+o_nz;
    212                         }
    213                         else{
    214                                 d_connectivity[node->Sid()]+=d_nz;
    215                                 o_connectivity[node->Sid()]+=o_nz;
     213                                connectivity_clone->SetValue(node->Pid(),d_nz+o_nz,ADD_VAL);
     214                        }
     215                        else{
     216                                d_connectivity[node->Lid()]+=d_nz;
     217                                o_connectivity[node->Lid()]+=o_nz;
    216218                        }
    217219                }
     
    221223                        load->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,flagsindices,set1enum,set2enum);
    222224                        if(node->IsClone()){
    223                                 connectivity_clone[node->Sid()]+=d_nz+o_nz;
    224                         }
    225                         else{
    226                                 d_connectivity[node->Sid()]+=d_nz;
    227                                 o_connectivity[node->Sid()]+=o_nz;
     225                                connectivity_clone->SetValue(node->Pid(),d_nz+o_nz,ADD_VAL);
     226                        }
     227                        else{
     228                                d_connectivity[node->Lid()]+=d_nz;
     229                                o_connectivity[node->Lid()]+=o_nz;
    228230                        }
    229231                }
     
    239241
    240242        /*sum over all cpus*/
    241         ISSM_MPI_Allreduce((void*)connectivity_clone,(void*)all_connectivity_clone,numnodes,ISSM_MPI_INT,ISSM_MPI_SUM,IssmComm::GetComm());
    242         xDelete<int>(connectivity_clone);
     243        connectivity_clone->Assemble();
     244        IssmDouble* serial_connectivity_clone=NULL;
     245        femmodel->GetLocalVectorWithClonesVertices(&serial_connectivity_clone,connectivity_clone);
     246        delete connectivity_clone;
    243247
    244248        if(set1enum==FsetEnum){
     
    251255                                for(j=0;j<node->fsize;j++){
    252256                                        _assert_(count<m);
    253                                         d_nnz[count]=numberofdofspernode*(d_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]);
    254                                         o_nnz[count]=numberofdofspernode*(o_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]);
     257                                        d_nnz[count]=numberofdofspernode*(d_connectivity[node->Lid()] + reCast<int>(serial_connectivity_clone[node->Lid()]));
     258                                        o_nnz[count]=numberofdofspernode*(o_connectivity[node->Lid()] + reCast<int>(serial_connectivity_clone[node->Lid()]));
    255259                                        if(d_nnz[count]>n)   d_nnz[count]=n;
    256260                                        if(o_nnz[count]>N-n) o_nnz[count]=N-n;
     
    266270        xDelete<int>(d_connectivity);
    267271        xDelete<int>(o_connectivity);
    268         xDelete<int>(all_connectivity_clone);
     272        xDelete<IssmDouble>(serial_connectivity_clone);
    269273
    270274        /*Allocate ouptput pointer*/
Note: See TracChangeset for help on using the changeset viewer.