Ignore:
Timestamp:
09/29/15 14:01:53 (9 years ago)
Author:
mhnguyen
Message:

Correcting a bug in interpolation domain

+) Replace shared send buffer by seperate buffer for each proc
+) Remove some redundant codes

Test
+) On Curie
+) test_client, test_complete and test_remap pass

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/filter/spatial_transform_filter.cpp

    r690 r709  
    8080    std::map<int, CArray<int,1> >::const_iterator itbSend = localIndexToSend.begin(), itSend, 
    8181                                                  iteSend = localIndexToSend.end(); 
    82     int sendBuffSize = 0; 
    83     for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize = (sendBuffSize < itSend->second.numElements()) 
    84                                                                      ? itSend->second.numElements(): sendBuffSize; 
    85     double* sendBuff; 
    86     if (0 != sendBuffSize) sendBuff = new double[sendBuffSize]; 
     82    int idxSendBuff = 0; 
     83    std::vector<double*> sendBuff(localIndexToSend.size()); 
     84    for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 
     85    { 
     86      if (0 != itSend->second.numElements()) 
     87        sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 
     88    } 
     89 
     90    idxSendBuff = 0; 
    8791    std::vector<MPI_Request> sendRequest; 
    88     for (itSend = itbSend; itSend != iteSend; ++itSend) 
     92    for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 
    8993    { 
    9094      int destRank = itSend->first; 
     
    9397      for (int idx = 0; idx < countSize; ++idx) 
    9498      { 
    95         sendBuff[idx] = dataSrc(localIndex_p(idx)); 
     99        sendBuff[idxSendBuff][idx] = dataSrc(localIndex_p(idx)); 
    96100      } 
    97101      sendRequest.push_back(MPI_Request()); 
    98       MPI_Isend(sendBuff, countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRequest.back()); 
     102      MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRequest.back()); 
    99103    } 
    100104 
     
    113117      int countSize = itRecv->second.size(); 
    114118      MPI_Recv(recvBuff, recvBuffSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &status); 
     119      int countBuff = 0; 
     120      MPI_Get_count(&status, MPI_DOUBLE, &countBuff); 
     121      if (countBuff != countSize) 
     122        ERROR("CSpatialTransformFilterEngine::apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest)", 
     123              "Incoherent between the received size and expected size"); 
    115124      for (int idx = 0; idx < countSize; ++idx) 
    116125      { 
     
    119128        for (int i = 0; i < numIndex; ++i) 
    120129        { 
    121 //        if (localIndex_p[i].first >= dataDest.numElements()) 
    122130          dataDest(localIndex_p[i].first) += recvBuff[idx] * localIndex_p[i].second; 
    123131        } 
     
    125133    } 
    126134 
    127     std::vector<MPI_Status> requestStatus(sendRequest.size()); 
    128     if (!sendRequest.empty()) MPI_Wait(&sendRequest[0], &requestStatus[0]); 
    129     if (0 != sendBuffSize) delete [] sendBuff; 
     135 
     136    if (!sendRequest.empty()) MPI_Waitall(sendRequest.size(), &sendRequest[0], MPI_STATUSES_IGNORE); 
     137    idxSendBuff = 0; 
     138    for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 
     139    { 
     140      if (0 != itSend->second.numElements()) 
     141        delete [] sendBuff[idxSendBuff]; 
     142    } 
    130143    if (0 != recvBuffSize) delete [] recvBuff; 
    131144  } 
Note: See TracChangeset for help on using the changeset viewer.