Changeset 2666


Ignore:
Timestamp:
10/25/24 09:19:08 (19 hours ago)
Author:
jderouillat
Message:

Backporting 1856 and 2663, related to reproductibilty of interpolation's order

Location:
XIOS3/branches/xios-3.0-beta/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/branches/xios-3.0-beta/src/mpi_tag.hpp

    r833 r2666  
    4444#define MPI_DOMAIN_INTERPOLATION_WEIGHT 9 
    4545 
    46  
     46/* Tag for mpi communication to send and receive info of DOMAIN in domain interpolation*/  
     47#define MPI_DOMAIN_INTERPOLATION_SOURCE_RANK 10  
    4748 
    4849#endif 
  • XIOS3/branches/xios-3.0-beta/src/transformation/domain_algorithm/domain_algorithm_interpolate.cpp

    r2313 r2666  
    548548      transWeight[it->first].push_back(tmp[i].second); 
    549549    }       
    550   }       
     550  } 
     551   
     552  std::map<int, std::vector<double> > transWeightOrdered(transWeight.begin(), transWeight.end()); 
     553  transWeight.clear(); 
     554  std::map<int, std::vector<double> >::const_iterator itWeightO = transWeightOrdered.begin(); 
     555  for(; itWeightO!=transWeightOrdered.end() ; ++itWeightO) { 
     556      transWeight[itWeightO->first] = itWeightO->second; 
     557  } 
     558   
     559  std::map<int, std::vector<int> > transMapOrdered(transMap.begin(), transMap.end()); 
     560  transMap.clear(); 
     561  std::map<int, std::vector<int> >::const_iterator itMapO = transMapOrdered.begin(); 
     562  for(; itMapO!=transMapOrdered.end() ; ++itMapO) { 
     563      transMap[itMapO->first] = itMapO->second; 
     564  } 
    551565} 
    552566CATCH 
     
    599613  int* sendBuff = new int[nbClient]; 
    600614  int* recvBuff = new int[nbClient]; 
     615 
     616  int* sendParticipants = new int[nbClient]; 
     617  int* recvParticipants = new int[nbClient]; 
     618   
    601619  for (int i = 0; i < nbClient; ++i) 
    602620  { 
    603621    sendBuff[i] = 0; 
    604622    recvBuff[i] = 0; 
     623    sendParticipants[i]=0 ; 
     624    recvParticipants[i]=0 ; 
    605625  } 
    606626  int sendBuffSize = 0; 
     
    617637    } 
    618638    sendBuff[itMap->first] = sizeIndex; 
     639    sendParticipants[itMap->first] = 1 ; 
    619640    sendBuffSize += sizeIndex; 
    620641  } 
    621642 
    622  
    623643  MPI_Allreduce(sendBuff, recvBuff, nbClient, MPI_INT, MPI_SUM, context->intraComm_); 
     644  MPI_Allreduce(sendParticipants, recvParticipants, nbClient, MPI_INT, MPI_SUM, context->intraComm_); 
    624645 
    625646  int* sendIndexDestBuff = new int [sendBuffSize]; 
     
    647668      } 
    648669    } 
     670     
     671    sendRequest.push_back(MPI_Request()); 
     672    MPI_Isend(&clientRank, 
     673             1, 
     674             MPI_INT, 
     675             itMap->first, 
     676             MPI_DOMAIN_INTERPOLATION_SOURCE_RANK, 
     677             context->intraComm_, 
     678             &sendRequest.back()); 
    649679 
    650680    sendRequest.push_back(MPI_Request()); 
     
    676706 
    677707  int recvBuffSize = recvBuff[clientRank]; 
     708  int numberOfParticipants = recvParticipants[clientRank] ; 
     709 
    678710  int* recvIndexDestBuff = new int [recvBuffSize]; 
    679711  int* recvIndexSrcBuff  = new int [recvBuffSize]; 
     
    681713  int receivedSize = 0; 
    682714  int clientSrcRank; 
    683   while (receivedSize < recvBuffSize) 
     715  
     716  
     717  // this part is done to impose a specific order for reception to retrive reproducibility  
     718  set<int> rankOrder ;  
     719  for (int np=0 ; np < numberOfParticipants; ++np) 
     720  { 
     721    MPI_Status recvStatus; 
     722    int rank ; 
     723    MPI_Recv(&rank, 
     724             1, 
     725             MPI_INT, 
     726             MPI_ANY_SOURCE, 
     727             MPI_DOMAIN_INTERPOLATION_SOURCE_RANK, 
     728             context->intraComm_, 
     729             &recvStatus); 
     730    rankOrder.insert(rank) ; 
     731  } 
     732   
     733  for (auto  clientSrcRank : rankOrder) 
    684734  { 
    685735    MPI_Status recvStatus; 
     
    687737             recvBuffSize, 
    688738             MPI_INT, 
    689              MPI_ANY_SOURCE, 
     739             clientSrcRank, 
    690740             MPI_DOMAIN_INTERPOLATION_DEST_INDEX, 
    691741             context->intraComm_, 
     
    694744    int countBuff = 0; 
    695745    MPI_Get_count(&recvStatus, MPI_INT, &countBuff); 
    696     clientSrcRank = recvStatus.MPI_SOURCE; 
     746//    clientSrcRank = recvStatus.MPI_SOURCE; 
    697747 
    698748    MPI_Recv((recvIndexSrcBuff + receivedSize), 
     
    720770  } 
    721771 
     772  std::map<int, std::vector<double> > transWeightOrdered(transWeight.begin(), transWeight.end()); 
     773  transWeight.clear(); 
     774  std::map<int, std::vector<double> >::const_iterator itWeightO = transWeightOrdered.begin(); 
     775  for(; itWeightO!=transWeightOrdered.end() ; ++itWeightO) { 
     776      transWeight[itWeightO->first] = itWeightO->second; 
     777  } 
     778   
     779  std::map<int, std::vector<int> > transMapOrdered(transMap.begin(), transMap.end()); 
     780  transMap.clear(); 
     781  std::map<int, std::vector<int> >::const_iterator itMapO = transMapOrdered.begin(); 
     782  for(; itMapO!=transMapOrdered.end() ; ++itMapO) { 
     783      transMap[itMapO->first] = itMapO->second; 
     784  } 
     785   
    722786  std::vector<MPI_Status> requestStatus(sendRequest.size()); 
    723787  MPI_Waitall(sendRequest.size(), &sendRequest[0], MPI_STATUS_IGNORE); 
    724788 
     789  delete [] sendParticipants ;                                                                                                                               
     790  delete [] recvParticipants ; 
    725791  delete [] sendIndexDestBuff; 
    726792  delete [] sendIndexSrcBuff; 
Note: See TracChangeset for help on using the changeset viewer.