Changeset 97c25dd for src


Ignore:
Timestamp:
Dec 8, 2011, 12:53:58 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
76e019
Parents:
1610dc
Message:

Work on a red-black communication routine to half the communication amount.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1247 5161e1c8-67bf-11de-9fd5-51895aff932f

Location:
src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • src/comm/comm.hpp

    r1610dc r97c25dd  
    5252  virtual void CommFromGhosts(Grid& grid) = 0;
    5353  virtual void CommToGhosts(Grid& grid) = 0;
     54  virtual void CommToGhostsRB(Grid& grid, const int& offset) = 0;
    5455  virtual void CommSubgrid(Grid& grid_old, Grid& grid_new) = 0;
    5556  virtual void CommAddSubgrid(Grid& grid_old, Grid& grid_new) = 0;
  • src/comm/comm_mpi.cpp

    r1610dc r97c25dd  
    313313  Timer::Start("CommToGhosts");
    314314
     315  Timer::Start("CommToGhostsGetCommunicator");
    315316  MPI_Comm comm = comm_info.GetCommunicator(grid);
     317  Timer::Stop("CommToGhostsGetCommunicator");
    316318
    317319  if (comm != MPI_COMM_NULL) {
     
    323325    for (int i=2; i>=0; --i) {
    324326
     327      Timer::Start("CommToGhostsCartShift");
    325328      MPI_Cart_shift(comm, i, 1, &neighbors.Left(), &neighbors.Right());
     329      Timer::Stop("CommToGhostsCartShift");
    326330
    327331      MPI_Datatype dts_left, dts_right;
     
    330334
    331335      if (has_halo_1[i]) {
     336        Timer::Start("CommToGhostsGetDatatypeSubarray");
    332337        dts_left = comm_info.GetDatatypeSubarray(grid, grid.Iterators().NearBoundary1()[i]);
    333338        dtr_left = comm_info.GetDatatypeSubarray(grid, grid.Iterators().Halo1()[i]);
     339        Timer::Stop("CommToGhostsGetDatatypeSubarray");
    334340        num_left = 1;
    335341      }else {
     
    340346
    341347      if (has_halo_2[i]) {
     348        Timer::Start("CommToGhostsGetDatatypeSubarray");
    342349        dts_right = comm_info.GetDatatypeSubarray(grid, grid.Iterators().NearBoundary2()[i]);
    343350        dtr_right = comm_info.GetDatatypeSubarray(grid, grid.Iterators().Halo2()[i]);
     351        Timer::Stop("CommToGhostsGetDatatypeSubarray");
    344352        num_right = 1;
    345353      }else {
     
    349357      }
    350358
    351       Timer::Start("MPI_Sendrecv");
     359      Timer::Start("CommToGhostsCommunication");
    352360      MPI_Sendrecv(&(grid(0)), num_right, dts_right, neighbors.Right(), 3,
    353361                   &(grid(0)), num_left,  dtr_left,  neighbors.Left(),  3,
     
    356364                   &(grid(0)), num_right, dtr_right, neighbors.Right(), 4,
    357365                   comm, MPI_STATUS_IGNORE);
    358       Timer::Stop("MPI_Sendrecv");
     366      Timer::Stop("CommToGhostsCommunication");
    359367
    360368    }
     
    362370
    363371  Timer::Stop("CommToGhosts");
     372}
     373
     374void CommMPI::CommToGhostsRB(Grid& grid, const int& offset)
     375{
     376  MPI_Comm comm = comm_info.GetCommunicator(grid);
     377
     378  if (comm != MPI_COMM_NULL) {
     379
     380    Index i;
     381    int num_left, num_right;
     382    MPI_Datatype dts_left, dts_right;
     383    MPI_Datatype dtr_left, dtr_right;
     384    Tuple<int> neighbors;
     385    std::vector<vmg_float> buffer_send_left, buffer_send_right;
     386    std::vector<vmg_float> buffer_recv_left, buffer_recv_right;
     387    std::vector<vmg_float>::const_iterator iter;
     388
     389    const Index halo_size_1 = grid.Local().HaloEnd1() - grid.Local().HaloBegin1();
     390    const Index halo_size_2 = grid.Local().HaloEnd2() - grid.Local().HaloBegin2();
     391
     392    buffer_send_left.clear();
     393    buffer_send_right.clear();
     394    buffer_recv_left.clear();
     395    buffer_recv_right.clear();
     396
     397    MPI_Cart_shift(comm, 2, 1, &neighbors.Left(), &neighbors.Right());
     398
     399    if (halo_size_1.Z()) {
     400
     401      buffer_send_left.reserve(grid.Local().Size().X() *
     402                               grid.Local().Size().Y() *
     403                               halo_size_1.Z() / 2);
     404
     405      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     406        for (i.Y()=grid.Local().Begin().Y(); i.Y()<grid.Local().End().Y(); ++i.Y())
     407          for (i.Z()=grid.Local().Begin().Z() + (i.X()+i.Y()+offset)%2;
     408               i.Z()<grid.Local().Begin().Z() + halo_size_1.Z();
     409               i.Z() += 2)
     410            buffer_send_left.push_back(grid.GetVal(i));
     411    }
     412
     413    if (halo_size_2.Z()) {
     414
     415      buffer_send_right.reserve(grid.Local().Size().X() *
     416                                grid.Local().Size().Y() *
     417                                halo_size_2.Z() / 2);
     418
     419      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     420        for (i.Y()=grid.Local().Begin().Y(); i.Y()<grid.Local().End().Y(); ++i.Y())
     421          for (i.Z()=grid.Local().End().Z() - halo_size_2.Z() + (i.X()+i.Y()+offset)%2;
     422               i.Z()<grid.Local().End().Z();
     423               i.Z() += 2)
     424            buffer_send_right.push_back(grid.GetVal(i));
     425
     426    }
     427
     428    buffer_recv_left.resize(buffer_send_left.size());
     429    buffer_recv_right.resize(buffer_send_right.size());
     430
     431    MPI_Sendrecv(&buffer_send_right.front(), buffer_send_right.size(), MPI_DOUBLE, neighbors.Right(), 7,
     432                 &buffer_recv_left.front(), buffer_recv_left.size(), MPI_DOUBLE, neighbors.Left(), 7,
     433                 comm, MPI_STATUS_IGNORE);
     434
     435    MPI_Sendrecv(&buffer_send_left.front(), buffer_send_left.size(), MPI_DOUBLE, neighbors.Left(), 8,
     436                 & buffer_recv_right.front(), buffer_recv_right.size(), MPI_DOUBLE, neighbors.Right(), 8,
     437                 comm, MPI_STATUS_IGNORE);
     438
     439    if (halo_size_1.Z()) {
     440
     441      iter = buffer_recv_left.begin();
     442      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     443        for (i.Y()=grid.Local().Begin().Y(); i.Y()<grid.Local().End().Y(); ++i.Y())
     444          for (i.Z() = (i.X()+i.Y()+offset)%2; i.Z() < grid.Local().Begin().Z(); i.Z() += 2)
     445            grid(i) = *iter++;
     446
     447    }
     448
     449    if (halo_size_2.Z()) {
     450
     451      iter = buffer_recv_right.begin();
     452      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     453        for (i.Y()=grid.Local().Begin().Y(); i.Y()<grid.Local().End().Y(); ++i.Y())
     454          for (i.Z()=grid.Local().End().Z() + (i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     455            grid(i) = *iter++;
     456
     457    }
     458
     459    buffer_send_left.clear();
     460    buffer_send_right.clear();
     461    buffer_recv_left.clear();
     462    buffer_recv_right.clear();
     463
     464    MPI_Cart_shift(comm, 1, 1, &neighbors.Left(), &neighbors.Right());
     465
     466    if (halo_size_1.Y()) {
     467
     468      buffer_send_left.reserve(grid.Local().Size().X() *
     469                               halo_size_1.Y() *
     470                               grid.Local().SizeTotal().Z() / 2);
     471
     472      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     473        for (i.Y()=grid.Local().Begin().Y(); i.Y()<grid.Local().Begin().Y() + halo_size_1.Y(); ++i.Y())
     474          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     475            buffer_send_left.push_back(grid.GetVal(i));
     476    }
     477
     478    if (halo_size_2.Y()) {
     479
     480      buffer_send_right.reserve(grid.Local().Size().X() *
     481                                halo_size_2.Y() *
     482                                grid.Local().SizeTotal().Z() / 2);
     483
     484      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     485        for (i.Y()=grid.Local().End().Y() - halo_size_2.Y(); i.Y()<grid.Local().End().Y(); ++i.Y())
     486          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     487            buffer_send_right.push_back(grid.GetVal(i));
     488
     489    }
     490
     491    buffer_recv_left.resize(buffer_send_left.size());
     492    buffer_recv_right.resize(buffer_send_right.size());
     493
     494    MPI_Sendrecv(&buffer_send_right.front(), buffer_send_right.size(), MPI_DOUBLE, neighbors.Right(), 7,
     495                 &buffer_recv_left.front(), buffer_recv_left.size(), MPI_DOUBLE, neighbors.Left(), 7,
     496                 comm, MPI_STATUS_IGNORE);
     497
     498    MPI_Sendrecv(&buffer_send_left.front(), buffer_send_left.size(), MPI_DOUBLE, neighbors.Left(), 8,
     499                 & buffer_recv_right.front(), buffer_recv_right.size(), MPI_DOUBLE, neighbors.Right(), 8,
     500                 comm, MPI_STATUS_IGNORE);
     501
     502    if (halo_size_1.Y()) {
     503
     504      iter = buffer_recv_left.begin();
     505      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     506        for (i.Y()=0; i.Y()<grid.Local().Begin().Y(); ++i.Y())
     507          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     508            grid(i) = *iter++;
     509
     510    }
     511
     512    if (halo_size_2.Y()) {
     513
     514      iter = buffer_recv_right.begin();
     515      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().End().X(); ++i.X())
     516        for (i.Y()=grid.Local().End().Y(); i.Y()<grid.Local().SizeTotal().Y(); ++i.Y())
     517          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     518            grid(i) = *iter++;
     519
     520    }
     521
     522    buffer_send_left.clear();
     523    buffer_send_right.clear();
     524    buffer_recv_left.clear();
     525    buffer_recv_right.clear();
     526
     527    MPI_Cart_shift(comm, 0, 1, &neighbors.Left(), &neighbors.Right());
     528
     529    if (halo_size_1.X()) {
     530
     531      buffer_send_left.reserve(halo_size_1.X() *
     532                               grid.Local().SizeTotal().Y() *
     533                               grid.Local().SizeTotal().Z() / 2);
     534
     535      for (i.X()=grid.Local().Begin().X(); i.X()<grid.Local().Begin().X() + halo_size_1.X(); ++i.X())
     536        for (i.Y()=0; i.Y()<grid.Local().SizeTotal().Y(); ++i.Y())
     537          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     538            buffer_send_left.push_back(grid.GetVal(i));
     539    }
     540
     541    if (halo_size_2.X()) {
     542
     543      buffer_send_right.reserve(halo_size_2.X() *
     544                                grid.Local().SizeTotal().Y() *
     545                                grid.Local().SizeTotal().Z() / 2);
     546
     547      for (i.X()=grid.Local().End().X() - halo_size_2.X(); i.X()<grid.Local().End().X(); ++i.X())
     548        for (i.Y()=0; i.Y()<grid.Local().SizeTotal().Y(); ++i.Y())
     549          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     550            buffer_send_right.push_back(grid.GetVal(i));
     551
     552    }
     553
     554    buffer_recv_left.resize(buffer_send_left.size());
     555    buffer_recv_right.resize(buffer_send_right.size());
     556
     557    MPI_Sendrecv(&buffer_send_right.front(), buffer_send_right.size(), MPI_DOUBLE, neighbors.Right(), 7,
     558                 &buffer_recv_left.front(), buffer_recv_left.size(), MPI_DOUBLE, neighbors.Left(), 7,
     559                 comm, MPI_STATUS_IGNORE);
     560
     561    MPI_Sendrecv(&buffer_send_left.front(), buffer_send_left.size(), MPI_DOUBLE, neighbors.Left(), 8,
     562                 & buffer_recv_right.front(), buffer_recv_right.size(), MPI_DOUBLE, neighbors.Right(), 8,
     563                 comm, MPI_STATUS_IGNORE);
     564
     565    if (halo_size_1.X()) {
     566
     567      iter = buffer_recv_left.begin();
     568      for (i.X()=0; i.X()<grid.Local().Begin().X(); ++i.X())
     569        for (i.Y()=0; i.Y()<grid.Local().SizeTotal().Y(); ++i.Y())
     570          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     571            grid(i) = *iter++;
     572    }
     573
     574    if (halo_size_2.X()) {
     575
     576      iter = buffer_recv_right.begin();
     577      for (i.X()=grid.Local().End().X(); i.X()<grid.Local().SizeTotal().X(); ++i.X())
     578        for (i.Y()=0; i.Y()<grid.Local().SizeTotal().Y(); ++i.Y())
     579          for (i.Z()=(i.X()+i.Y()+offset)%2; i.Z()<grid.Local().SizeTotal().Z(); i.Z() += 2)
     580            grid(i) = *iter++;
     581
     582    }
     583
     584  }
    364585}
    365586
  • src/comm/comm_mpi.hpp

    r1610dc r97c25dd  
    6060  void CommFromGhosts(Grid& grid);
    6161  void CommToGhosts(Grid& grid);
     62  void CommToGhostsRB(Grid& grid, const int& offset);
    6263  void CommSubgrid(Grid& grid_old, Grid& grid_new);
    6364  void CommAddSubgrid(Grid& grid_old, Grid& grid_new);
  • src/comm/comm_serial.cpp

    r1610dc r97c25dd  
    156156  mesh.IsConsistent();
    157157#endif
     158}
     159
     160void CommSerial::CommToGhostsRB(Grid& grid, const int& offset)
     161{
     162  CommToGhosts(grid);
    158163}
    159164
  • src/comm/comm_serial.hpp

    r1610dc r97c25dd  
    3939  void CommFromGhosts(Grid& grid);
    4040  void CommToGhosts(Grid& grid);
     41  void CommToGhostsRB(Grid& grid, const int& offset);
    4142  void CommSubgrid(Grid& grid_old, Grid& grid_new);
    4243  void CommAddSubgrid(Grid& grid_old, Grid& grid_new);
  • src/comm/mpi/comm_info.cpp

    r1610dc r97c25dd  
    2020
    2121#include "base/index.hpp"
     22#include "base/timer.hpp"
    2223#include "comm/mpi/comm_info.hpp"
    2324#include "grid/grid.hpp"
     
    129130MPI_Datatype VMG::MPI::CommInfo::GetDatatypeSubarray(const Index& begin, const Index& end, const Index& size_total)
    130131{
    131   std::map<Key, MPI_Datatype>::iterator iter = datatypes.find(Key(begin, end, size_total));
    132 
    133   if (iter != datatypes.end())
     132  const Key k = Key(begin, end, size_total);
     133
     134  std::map<Key, MPI_Datatype>::const_iterator iter = datatypes.lower_bound(k);
     135
     136  if (iter != datatypes.end() && !(datatypes.key_comp()(k, iter->first)))
    134137    return iter->second;
    135138
     
    143146  MPI_Type_commit(&dt);
    144147
     148  datatypes.insert(std::make_pair(k, dt));
     149
    145150  return dt;
    146151}
  • src/comm/mpi/key.cpp

    r1610dc r97c25dd  
    1919VMG::MPI::Key::Key()
    2020{
     21}
     22
     23VMG::MPI::Key::Key(const VMG::MPI::Key& other)
     24{
     25  this->int_keys.assign(other.int_keys.begin(), other.int_keys.end());
     26  this->addr_keys.assign(other.addr_keys.begin(), other.addr_keys.end());
    2127}
    2228
     
    8692    if (this->addr_keys[i] < other.addr_keys[i])
    8793      return true;
    88     else if (this->addr_keys[i] > other.addr_keys[i])
     94    else if (this-> addr_keys[i] > other.addr_keys[i])
    8995      return false;
    9096
  • src/comm/mpi/key.hpp

    r1610dc r97c25dd  
    2929public:
    3030  Key();
     31  Key(const VMG::MPI::Key& other);
    3132  Key(const Grid& grid);
    3233  Key(const Grid& grid_1, const Grid& grid_2);
  • src/smoother/gsrb.cpp

    r1610dc r97c25dd  
    4545      for (i.Z()=rhs.Local().Begin().Z() + ((i.X()+i.Y()+off+1) % 2); i.Z()<rhs.Local().End().Z(); i.Z()+=2) {
    4646
    47         temp = prefactor_inv * rhs.GetCorrectedVal(i);
     47        temp = prefactor_inv * rhs.GetVal(i);
    4848
    4949        for (Stencil::iterator iter=A.begin(); iter!=A.end(); ++iter)
     
    6464      for (i.Z()=rhs.Local().Begin().Z() + ((i.X()+i.Y()+off) % 2); i.Z()<rhs.Local().End().Z(); i.Z()+=2) {
    6565
    66         temp = prefactor_inv * rhs.GetCorrectedVal(i);
     66        temp = prefactor_inv * rhs.GetVal(i);
    6767
    6868        for (Stencil::iterator iter=A.begin(); iter!=A.end(); ++iter)
Note: See TracChangeset for help on using the changeset viewer.