Changeset 27377


Ignore:
Timestamp:
11/10/22 09:55:05 (2 years ago)
Author:
Mathieu Morlighem
Message:

CHG: optimizing memory allocations

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

Legend:

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

    r27376 r27377  
    14451445
    14461446        /*Now send and receive vector for vertices on partition edge*/
    1447         IssmDouble       **send_buffers  = xNew<IssmDouble*>(num_procs);
     1447        IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs);
     1448        IssmDouble  *recv_buffer  = xNewZeroInit<IssmDouble>(this->vertices->Size());
    14481449        ISSM_MPI_Request  *send_requests = xNew<ISSM_MPI_Request>(num_procs);
    1449         for (int rank = 0;rank<num_procs;rank++){
    1450                 #ifdef _HAVE_AD_
    1451                 send_buffers[rank] = xNew<IssmDouble>(this->vertices->Size(),"t"); //only one alloc, "t" is required by adolc
    1452                 #else
    1453                 send_buffers[rank] = xNew<IssmDouble>(this->vertices->Size());
    1454                 #endif
    1455                 send_requests[rank] = ISSM_MPI_REQUEST_NULL;
    1456         }
    1457         IssmDouble* recv_buffer = xNew<IssmDouble>(this->vertices->Size());
     1450        for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL;
     1451
    14581452        for(int rank=0;rank<num_procs;rank++){
    14591453                if(this->vertices->common_send[rank]){
    14601454                        int  numids = this->vertices->common_send[rank];
     1455                        send_buffers[rank] = xNew<IssmDouble>(numids,"t"); //only one alloc, "t" is required by adolc
    14611456                        for(int i=0;i<numids;i++){
    14621457                                int   master_lid = this->vertices->common_send_ids[rank][i];
     
    14961491
    14971492        /*Now send and receive vector for vertices on partition edge*/
    1498         IssmDouble       **send_buffers  = xNew<IssmDouble*>(num_procs);
     1493        IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs);
     1494        IssmDouble  *recv_buffer  = xNewZeroInit<IssmDouble>(this->vertices->Size());
    14991495        ISSM_MPI_Request  *send_requests = xNew<ISSM_MPI_Request>(num_procs);
    1500         for (int rank = 0;rank<num_procs;rank++){
    1501                 #ifdef _HAVE_AD_
    1502                 send_buffers[rank] = xNew<IssmDouble>(this->vertices->Size(),"t"); //only one alloc, "t" is required by adolc
    1503                 #else
    1504                 send_buffers[rank] = xNew<IssmDouble>(this->vertices->Size());
    1505                 #endif
    1506                 send_requests[rank] = ISSM_MPI_REQUEST_NULL;
    1507         }
    1508         IssmDouble* recv_buffer = xNew<IssmDouble>(this->vertices->Size());
     1496        for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL;
    15091497
    15101498        /*1st: add slaves to master values (reverse of what we usually do)*/
     
    15121500                if(this->vertices->common_recv[rank]){
    15131501                        int  numids = this->vertices->common_recv[rank];
     1502         send_buffers[rank] = xNew<IssmDouble>(numids,"t"); //only one alloc, "t" is required by adolc
    15141503                        for(int i=0;i<numids;i++){
    15151504                                int   master_lid = this->vertices->common_recv_ids[rank][i];
     
    15951584
    15961585        /*Now send and receive vector for nodes on partition edge*/
    1597         IssmDouble       **send_buffers  = xNew<IssmDouble*>(num_procs);
     1586        IssmDouble **send_buffers = xNewZeroInit<IssmDouble*>(num_procs);
     1587        IssmDouble  *recv_buffer  = xNewZeroInit<IssmDouble>(this->nodes->Size());
    15981588        ISSM_MPI_Request  *send_requests = xNew<ISSM_MPI_Request>(num_procs);
    1599         for (int rank = 0;rank<num_procs;rank++){
    1600                 #ifdef _HAVE_AD_
    1601                 send_buffers[rank] = xNew<IssmDouble>(this->nodes->Size(),"t"); //only one alloc, "t" is required by adolc
    1602                 #else
    1603                 send_buffers[rank] = xNew<IssmDouble>(this->nodes->Size());
    1604                 #endif
    1605                 send_requests[rank] = ISSM_MPI_REQUEST_NULL;
    1606         }
    1607         IssmDouble* recv_buffer = xNew<IssmDouble>(this->nodes->Size());
     1589        for (int rank = 0;rank<num_procs;rank++) send_requests[rank] = ISSM_MPI_REQUEST_NULL;
    16081590
    16091591        for(int rank=0;rank<num_procs;rank++){
    16101592                if(this->nodes->common_send[rank]){
    16111593                        int  numids = this->nodes->common_send[rank];
     1594                        send_buffers[rank] = xNew<IssmDouble>(numids,"t"); //only one alloc, "t" is required by adolc
    16121595                        for(int i=0;i<numids;i++){
    16131596                                int   master_lid = this->nodes->common_send_ids[rank][i];
  • issm/trunk-jpl/src/c/shared/MemOps/MemOps.h

    r26788 r27377  
    2020
    2121/* AD (mostly ADOLC) is sensitive to calls to ensurecontiguous. These changes limit its use.*/
    22 #ifdef _HAVE_AD_
    2322template <class T> T* xNew(unsigned int size, const char* const contig = &DEFCONTIG){
    24 #else
    25 template <class T> T* xNew(unsigned int size){
    26 #endif
    2723#ifdef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
    2824  T* aT_p=new T[size];
     
    5854}/*}}}*/
    5955// AD (mostly ADOLC) is sensitive to calls to ensurecontiguous. These changes limit its use.
    60 #ifdef _HAVE_AD_
    6156template <class T> T* xNewZeroInit(unsigned int size,const char* const contig = &DEFCONTIG){
    62 #else
    63 template <class T> T* xNewZeroInit(unsigned int size){
    64 #endif
    6557#ifdef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
    6658#ifdef _HAVE_AD_
Note: See TracChangeset for help on using the changeset viewer.