- Timestamp:
- Dec 8, 2011, 12:53:58 PM (14 years ago)
- Children:
- 76e019
- Parents:
- 1610dc
- Location:
- src
- Files:
-
- 9 edited
-
comm/comm.hpp (modified) (1 diff)
-
comm/comm_mpi.cpp (modified) (7 diffs)
-
comm/comm_mpi.hpp (modified) (1 diff)
-
comm/comm_serial.cpp (modified) (1 diff)
-
comm/comm_serial.hpp (modified) (1 diff)
-
comm/mpi/comm_info.cpp (modified) (3 diffs)
-
comm/mpi/key.cpp (modified) (2 diffs)
-
comm/mpi/key.hpp (modified) (1 diff)
-
smoother/gsrb.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/comm/comm.hpp
r1610dc r97c25dd 52 52 virtual void CommFromGhosts(Grid& grid) = 0; 53 53 virtual void CommToGhosts(Grid& grid) = 0; 54 virtual void CommToGhostsRB(Grid& grid, const int& offset) = 0; 54 55 virtual void CommSubgrid(Grid& grid_old, Grid& grid_new) = 0; 55 56 virtual void CommAddSubgrid(Grid& grid_old, Grid& grid_new) = 0; -
src/comm/comm_mpi.cpp
r1610dc r97c25dd 313 313 Timer::Start("CommToGhosts"); 314 314 315 Timer::Start("CommToGhostsGetCommunicator"); 315 316 MPI_Comm comm = comm_info.GetCommunicator(grid); 317 Timer::Stop("CommToGhostsGetCommunicator"); 316 318 317 319 if (comm != MPI_COMM_NULL) { … … 323 325 for (int i=2; i>=0; --i) { 324 326 327 Timer::Start("CommToGhostsCartShift"); 325 328 MPI_Cart_shift(comm, i, 1, &neighbors.Left(), &neighbors.Right()); 329 Timer::Stop("CommToGhostsCartShift"); 326 330 327 331 MPI_Datatype dts_left, dts_right; … … 330 334 331 335 if (has_halo_1[i]) { 336 Timer::Start("CommToGhostsGetDatatypeSubarray"); 332 337 dts_left = comm_info.GetDatatypeSubarray(grid, grid.Iterators().NearBoundary1()[i]); 333 338 dtr_left = comm_info.GetDatatypeSubarray(grid, grid.Iterators().Halo1()[i]); 339 Timer::Stop("CommToGhostsGetDatatypeSubarray"); 334 340 num_left = 1; 335 341 }else { … … 340 346 341 347 if (has_halo_2[i]) { 348 Timer::Start("CommToGhostsGetDatatypeSubarray"); 342 349 dts_right = comm_info.GetDatatypeSubarray(grid, grid.Iterators().NearBoundary2()[i]); 343 350 dtr_right = comm_info.GetDatatypeSubarray(grid, grid.Iterators().Halo2()[i]); 351 Timer::Stop("CommToGhostsGetDatatypeSubarray"); 344 352 num_right = 1; 345 353 }else { … … 349 357 } 350 358 351 Timer::Start(" MPI_Sendrecv");359 Timer::Start("CommToGhostsCommunication"); 352 360 MPI_Sendrecv(&(grid(0)), num_right, dts_right, neighbors.Right(), 3, 353 361 &(grid(0)), num_left, dtr_left, neighbors.Left(), 3, … … 356 364 &(grid(0)), num_right, dtr_right, neighbors.Right(), 4, 357 365 comm, MPI_STATUS_IGNORE); 358 Timer::Stop(" MPI_Sendrecv");366 Timer::Stop("CommToGhostsCommunication"); 359 367 360 368 } … … 362 370 363 371 Timer::Stop("CommToGhosts"); 372 } 373 374 void 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 } 364 585 } 365 586 -
src/comm/comm_mpi.hpp
r1610dc r97c25dd 60 60 void CommFromGhosts(Grid& grid); 61 61 void CommToGhosts(Grid& grid); 62 void CommToGhostsRB(Grid& grid, const int& offset); 62 63 void CommSubgrid(Grid& grid_old, Grid& grid_new); 63 64 void CommAddSubgrid(Grid& grid_old, Grid& grid_new); -
src/comm/comm_serial.cpp
r1610dc r97c25dd 156 156 mesh.IsConsistent(); 157 157 #endif 158 } 159 160 void CommSerial::CommToGhostsRB(Grid& grid, const int& offset) 161 { 162 CommToGhosts(grid); 158 163 } 159 164 -
src/comm/comm_serial.hpp
r1610dc r97c25dd 39 39 void CommFromGhosts(Grid& grid); 40 40 void CommToGhosts(Grid& grid); 41 void CommToGhostsRB(Grid& grid, const int& offset); 41 42 void CommSubgrid(Grid& grid_old, Grid& grid_new); 42 43 void CommAddSubgrid(Grid& grid_old, Grid& grid_new); -
src/comm/mpi/comm_info.cpp
r1610dc r97c25dd 20 20 21 21 #include "base/index.hpp" 22 #include "base/timer.hpp" 22 23 #include "comm/mpi/comm_info.hpp" 23 24 #include "grid/grid.hpp" … … 129 130 MPI_Datatype VMG::MPI::CommInfo::GetDatatypeSubarray(const Index& begin, const Index& end, const Index& size_total) 130 131 { 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))) 134 137 return iter->second; 135 138 … … 143 146 MPI_Type_commit(&dt); 144 147 148 datatypes.insert(std::make_pair(k, dt)); 149 145 150 return dt; 146 151 } -
src/comm/mpi/key.cpp
r1610dc r97c25dd 19 19 VMG::MPI::Key::Key() 20 20 { 21 } 22 23 VMG::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()); 21 27 } 22 28 … … 86 92 if (this->addr_keys[i] < other.addr_keys[i]) 87 93 return true; 88 else if (this-> addr_keys[i] > other.addr_keys[i])94 else if (this-> addr_keys[i] > other.addr_keys[i]) 89 95 return false; 90 96 -
src/comm/mpi/key.hpp
r1610dc r97c25dd 29 29 public: 30 30 Key(); 31 Key(const VMG::MPI::Key& other); 31 32 Key(const Grid& grid); 32 33 Key(const Grid& grid_1, const Grid& grid_2); -
src/smoother/gsrb.cpp
r1610dc r97c25dd 45 45 for (i.Z()=rhs.Local().Begin().Z() + ((i.X()+i.Y()+off+1) % 2); i.Z()<rhs.Local().End().Z(); i.Z()+=2) { 46 46 47 temp = prefactor_inv * rhs.Get CorrectedVal(i);47 temp = prefactor_inv * rhs.GetVal(i); 48 48 49 49 for (Stencil::iterator iter=A.begin(); iter!=A.end(); ++iter) … … 64 64 for (i.Z()=rhs.Local().Begin().Z() + ((i.X()+i.Y()+off) % 2); i.Z()<rhs.Local().End().Z(); i.Z()+=2) { 65 65 66 temp = prefactor_inv * rhs.Get CorrectedVal(i);66 temp = prefactor_inv * rhs.GetVal(i); 67 67 68 68 for (Stencil::iterator iter=A.begin(); iter!=A.end(); ++iter)
Note:
See TracChangeset
for help on using the changeset viewer.
