VTK-m  2.0
HierarchicalAugmenterFunctor.h
Go to the documentation of this file.
1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //============================================================================
10 // Copyright (c) 2018, The Regents of the University of California, through
11 // Lawrence Berkeley National Laboratory (subject to receipt of any required approvals
12 // from the U.S. Dept. of Energy). All rights reserved.
13 //
14 // Redistribution and use in source and binary forms, with or without modification,
15 // are permitted provided that the following conditions are met:
16 //
17 // (1) Redistributions of source code must retain the above copyright notice, this
18 // list of conditions and the following disclaimer.
19 //
20 // (2) Redistributions in binary form must reproduce the above copyright notice,
21 // this list of conditions and the following disclaimer in the documentation
22 // and/or other materials provided with the distribution.
23 //
24 // (3) Neither the name of the University of California, Lawrence Berkeley National
25 // Laboratory, U.S. Dept. of Energy nor the names of its contributors may be
26 // used to endorse or promote products derived from this software without
27 // specific prior written permission.
28 //
29 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
30 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
32 // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
36 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
37 // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
38 // OF THE POSSIBILITY OF SUCH DAMAGE.
39 //
40 //=============================================================================
41 //
42 // This code is an extension of the algorithm presented in the paper:
43 // Parallel Peak Pruning for Scalable SMP Contour Tree Computation.
44 // Hamish Carr, Gunther Weber, Christopher Sewell, and James Ahrens.
45 // Proceedings of the IEEE Symposium on Large Data Analysis and Visualization
46 // (LDAV), October 2016, Baltimore, Maryland.
47 //
48 // The PPP2 algorithm and software were jointly developed by
49 // Hamish Carr (University of Leeds), Gunther H. Weber (LBNL), and
50 // Oliver Ruebel (LBNL)
51 //==============================================================================
52 
53 #ifndef vtk_m_worklet_contourtree_distributed_hierarchicalaugmenterfunctor_h
54 #define vtk_m_worklet_contourtree_distributed_hierarchicalaugmenterfunctor_h
55 
56 #include <vtkm/Types.h>
60 
61 // clang-format off
62 VTKM_THIRDPARTY_PRE_INCLUDE
63 #include <vtkm/thirdparty/diy/diy.h>
64 VTKM_THIRDPARTY_POST_INCLUDE
65 // clang-format on
66 
67 
68 namespace vtkm
69 {
70 namespace worklet
71 {
72 namespace contourtree_distributed
73 {
74 
76 template <typename FieldType>
78 {
79 public:
84  : TimingsLogLevel(timingsLogLevel)
85  {
86  }
87 
88 
89  void operator()(
91  blockData, // local Block.
92  const vtkmdiy::ReduceProxy& rp, // communication proxy
93  const vtkmdiy::RegularSwapPartners& // partners of the current block (unused)
94  ) const
95  {
96  // Track timing of main steps
97  vtkm::cont::Timer totalTimer; // Total time for each call
98  totalTimer.Start();
99  vtkm::cont::Timer timer; // Time individual steps
100  timer.Start();
101  std::stringstream timingsStream;
102 
104  auto round = rp.round();
105  const auto selfid = rp.gid();
106 
107  for (int i = 0; i < rp.in_link().size(); ++i)
108  {
109  int ingid = rp.in_link().target(i).gid;
110  if (ingid != selfid)
111  { // Receive and augment
112  rp.dequeue(ingid, blockData->HierarchicalAugmenter.InData);
113  blockData->HierarchicalAugmenter.RetrieveInAttachmentPoints();
114  }
115  }
116 
117  // log the time for getting the data from DIY
118  timingsStream << " " << std::setw(38) << std::left << "Retrieve In Attachment Points"
119  << ": " << timer.GetElapsedTime() << " seconds" << std::endl;
120  timer.Start();
121 
122  for (int i = 0; i < rp.out_link().size(); ++i)
123  {
124  auto target = rp.out_link().target(i);
125  if (target.gid != selfid)
126  { // Send to partner
127  blockData->HierarchicalAugmenter.PrepareOutAttachmentPoints(round);
128  // TODO/FIXME: Correct function? Correct round?
129  rp.enqueue(target, blockData->HierarchicalAugmenter.OutData);
130  // TODO/FIXME: Is it save to already release HierarchicalAugmenter.OutData (and InData) here. Don't we free the arrays before the other block had the chance to complete its rp.dequeue?
131  blockData->HierarchicalAugmenter.ReleaseSwapArrays();
132  }
133  }
134 
135  // Log the time for enqueue the data for sending via DIY
136  timingsStream << " " << std::setw(38) << std::left
137  << "Prepare and Enqueue Out Attachment Points"
138  << ": " << timer.GetElapsedTime() << " seconds" << std::endl;
139  // Log the total this functor call step took
140  timingsStream << " " << std::setw(38) << std::left << "Total Time Functor Step"
141  << ": " << totalTimer.GetElapsedTime() << " seconds" << std::endl;
142  // Record the times we logged
144  std::endl
145  << " ---------------- Hierarchical Augmenter Functor Step ---------------------"
146  << std::endl
147  << " Rank : " << rank << std::endl
148  << " DIY Id : " << selfid << std::endl
149  << " Round : " << rp.round() << std::endl
150  << timingsStream.str());
151  }
152 
153 private:
156 };
157 
158 } // namespace contourtree_distributed
159 } // namespace worklet
160 } // namespace vtkm
161 
162 #endif
vtkm::cont::EnvironmentTracker::GetCommunicator
static const VTKM_CONT vtkmdiy::mpi::communicator & GetCommunicator()
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
Types.h
vtkm::cont::Timer::Start
VTKM_CONT void Start()
vtkm::worklet::contourtree_distributed::DistributedContourTreeBlockData
Definition: DistributedContourTreeBlockData.h:76
vtkm::cont::LogLevel
LogLevel
Log levels for use with the logging macros.
Definition: Logging.h:298
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::worklet::contourtree_distributed::HierarchicalAugmenterFunctor::operator()
void operator()(vtkm::worklet::contourtree_distributed::DistributedContourTreeBlockData< FieldType > *blockData, const vtkmdiy::ReduceProxy &rp, const vtkmdiy::RegularSwapPartners &) const
Definition: HierarchicalAugmenterFunctor.h:89
DistributedContourTreeBlockData.h
vtkm::worklet::contourtree_distributed::DistributedContourTreeBlockData::HierarchicalAugmenter
vtkm::worklet::contourtree_distributed::HierarchicalAugmenter< FieldType > HierarchicalAugmenter
Definition: DistributedContourTreeBlockData.h:93
Types.h
vtkm::cont::Timer
A class that can be used to time operations in VTK-m that might be occuring in parallel.
Definition: Timer.h:43
PrintGraph.h
VTKM_LOG_S
#define VTKM_LOG_S(level,...)
Writes a message using stream syntax to the indicated log level.
Definition: Logging.h:261
vtkm::worklet::contourtree_distributed::HierarchicalAugmenterFunctor::TimingsLogLevel
vtkm::cont::LogLevel TimingsLogLevel
Log level to be used for outputting timing information. Default is vtkm::cont::LogLevel::Perf.
Definition: HierarchicalAugmenterFunctor.h:155
vtkm::worklet::contourtree_distributed::HierarchicalAugmenterFunctor
Functor used by DIY reduce the merge data blocks in parallel.
Definition: HierarchicalAugmenterFunctor.h:77
vtkm::cont::Timer::GetElapsedTime
VTKM_CONT vtkm::Float64 GetElapsedTime() const
Get the elapsed time measured by the given device adapter.
vtkm::cont::LogLevel::Perf
@ Perf
General timing data and algorithm flow information, such as filter execution, worklet dispatches,...
vtkm::worklet::contourtree_distributed::HierarchicalAugmenterFunctor::HierarchicalAugmenterFunctor
HierarchicalAugmenterFunctor(vtkm::cont::LogLevel timingsLogLevel=vtkm::cont::LogLevel::Perf)
Create the functor.
Definition: HierarchicalAugmenterFunctor.h:83