RTC Toolkit  0.1.0-alpha
computationGpu.hpp
Go to the documentation of this file.
1 
9 #ifndef RTCTK_EXAMPLEDATATASK_COMPUTATION_HPP
10 #define RTCTK_EXAMPLEDATATASK_COMPUTATION_HPP
11 
17 
18 #include <string>
19 #include <vector>
20 #include <numeric>
21 #include <chrono>
22 
23 using namespace rtctk::componentFramework;
26 
27 namespace rtctk::exampleDataTask {
28 
29 template<class TopicType>
31 {
32  public:
34  : m_rtr(rtr)
35  , m_oldb(oldb)
36  , m_name(name)
37  , m_dp_slopes("/common/static/wfs_1/slopes")
38  , m_dp_modes("/" + m_name + "/" + "static/computation/modes")
39  , m_dp_iterations("/" + m_name + "/" + "static/common/samples_to_read")
40  , m_dp_gpu("/" + m_name + "/" + "static/common/gpu")
41  , m_dp_s2m("/" + m_name + "/" + "dynamic/computation/slopes2modes")
42  , m_dp_avg_slopes("/common/dynamic/wfs_1/avg_slopes")
43  , m_dp_avg_modes("/common/dynamic/wfs_1/avg_modes")
44  , m_dp_stats_iteration("/" + m_name + "/" + "statistics/computation/iteration")
45  , m_dp_stats_time("/" + m_name + "/" + "statistics/computation/time")
46  , m_dp_stats_last_id("/" + m_name + "/" + "statistics/computation/last_sample_id")
47  {
48  m_sample_id = 0;
49  m_callback_counter = 0;
50  m_iteration = 0;
51 
52  // create some oldb points
53  m_oldb.CreateDataPoint(m_dp_stats_iteration, "RtcInt32");
54  m_oldb.CreateDataPoint(m_dp_stats_time, "RtcDouble");
55  m_oldb.CreateDataPoint(m_dp_stats_last_id, "RtcInt32");
56  m_oldb.SetDataPoint<int32_t>(m_dp_stats_iteration, 0);
57  m_oldb.SetDataPoint<double>(m_dp_stats_time, 0.0);
58  m_oldb.SetDataPoint<int32_t>(m_dp_stats_last_id, 0);
59 
60  StaticLoad();
61  }
62 
64  {
65  m_gpu_comp.reset();
66  }
67 
68  void StaticLoad()
69  {
70  // read anything that is unlikely to change.
71  m_n_slopes = m_rtr.GetDataPoint<int32_t>(m_dp_slopes);
72  m_n_modes = m_rtr.GetDataPoint<int32_t>(m_dp_modes);
73  m_n_iterations = m_rtr.GetDataPoint<int32_t>(m_dp_iterations);
74  m_gpu = m_rtr.GetDataPoint<int32_t>(m_dp_gpu);
75 
76  // set vectors and matrix to correct size.
77  m_buffer_matrix.resize(m_n_iterations, m_n_slopes);
78  m_avg_slopes.resize(m_n_slopes);
79  m_s2m_matrix.resize(m_n_modes, m_n_slopes);
80  m_avg_modes.resize(m_n_modes);
81 
82  // fill with zeros where needed.
83  std::fill (m_avg_slopes.begin(), m_avg_slopes.end(), 0.0);
84  std::fill (m_avg_modes.begin(), m_avg_modes.end(), 0.0);
85 
86  LOG4CPLUS_DEBUG(GetLogger(), "m_n_slopes: " << m_n_slopes);
87  LOG4CPLUS_DEBUG(GetLogger(), "m_n_modes: " << m_n_modes);
88  LOG4CPLUS_DEBUG(GetLogger(), "m_n_iterations: " << m_n_iterations);
89  LOG4CPLUS_DEBUG(GetLogger(), "m_gpu: " << m_gpu);
90 
91  // call the constructor for the
92  m_gpu_comp = std::make_unique<exampleGpuLib>(m_n_slopes, m_n_modes, m_gpu);
93 
94  // set avg array to zero
95  m_gpu_comp->SetAvgSlopes(m_avg_slopes);
96 
97  // dynamic load
98  DynamicLoad();
99  }
100 
101  void DynamicLoad()
102  {
103  // read things that will change
104  m_s2m_matrix = m_rtr.GetDataPoint<MatrixBuffer<float>>(m_dp_s2m);
105  if(m_n_modes != (int) m_s2m_matrix.get_nrows() || m_n_slopes != (int) m_s2m_matrix.get_ncols())
106  {
107  LOG4CPLUS_INFO(GetLogger(), "Computation::DynamicLoad() - s2m wrong shape ");
108  LOG4CPLUS_INFO(GetLogger(), "Computation::DynamicLoad() - Expected: " << m_n_modes << " x " << m_n_slopes);
109  LOG4CPLUS_INFO(GetLogger(), "Computation::DynamicLoad() - recieved: " << m_s2m_matrix.get_nrows() << " x " << m_s2m_matrix.get_ncols());
110  throw std::runtime_error("s2m wrong shape");
111  }
112  assert((int)m_s2m_matrix.get_nrows() == m_n_modes);
113  assert((int)m_s2m_matrix.get_ncols() == m_n_slopes);
114 
115  // upload to GPU
116  m_gpu_comp->SetMatrix(m_s2m_matrix.data());
117  }
118 
119  // TODO: come up with better name
120  void ThreadInit()
121  {
122  m_gpu_comp->initReaderThread();
123  }
124 
125 
126  void OnDataAvailable(TopicType const& sample) // TODO: should this be nothrow?
127  {
128  // call the GPU
129  m_sample_id = sample.sample_id;
130  m_gpu_comp->NewSample(sample.wfs.slopes.data(), m_callback_counter);
131  m_callback_counter++;
132  }
133 
134  void Reset()
135  {
136  m_iteration=0;
137  ResetComputation();
138  }
139 
140  void Compute()
141  {
142  //TODO: add this back in later
143  // assert(m_callback_counter == m_n_iterations);
144  LOG4CPLUS_INFO(GetLogger(), "Computation::Compute() - samples: " << m_callback_counter);
145  m_iteration++;
146 
147  auto time_start = std::chrono::system_clock::now();
148  m_gpu_comp->Compute();
149  auto time_stop = std::chrono::system_clock::now();
150  std::chrono::duration<double> elapsed = time_stop - time_start;
151  // get Result and avg array and save to
152  m_avg_slopes = m_gpu_comp->GetAvgSlopes();
153  m_avg_modes = m_gpu_comp->GetResults();
154 
155  // write output back to runtime repo
156  m_rtr.SetDataPoint<std::vector<float>>(m_dp_avg_slopes, m_avg_slopes);
157  m_rtr.SetDataPoint<std::vector<float>>(m_dp_avg_modes, m_avg_modes);
158 
159  // write statistics:
160  m_oldb.SetDataPoint<int32_t>(m_dp_stats_iteration, m_iteration);
161  m_oldb.SetDataPoint<double>(m_dp_stats_time, elapsed.count());
162  m_oldb.SetDataPoint<int32_t>(m_dp_stats_last_id, m_sample_id);
163 
164  // reset the computation
165  ResetComputation();
166  }
167 
168  bool isComputing(){return m_computation_running;}
169 
170  protected:
172  {
173  // This is invoked going to idle to clean up incase of stoped part way through run.
174  m_callback_counter = 0;
175  // set avg to zero
176  std::fill (m_avg_slopes.begin(), m_avg_slopes.end(), 0.0);
177  m_gpu_comp->SetAvgSlopes(m_avg_slopes);
178  }
179 
180 
183  std::string m_name;
184 
185  // inputs
191 
192  //outputs to write
195 
196  // write statistics:
200 
201  unsigned int m_sample_id;
202  unsigned int m_iteration;
203  std::atomic<unsigned int> m_callback_counter;
204  std::atomic<bool> m_computation_running;
205 
206  std::unique_ptr<exampleGpuLib> m_gpu_comp;
207 
211  int m_gpu;
212 
213  std::vector<float> m_avg_slopes;
214  std::vector<float> m_avg_modes;
217 };
218 
219 } // namespace
220 
221 #endif
rtctk::exampleDataTask::ComputationGpu::m_avg_modes
std::vector< float > m_avg_modes
Definition: computationGpu.hpp:214
rtctk::exampleDataTask::ComputationGpu::m_dp_avg_slopes
DataPointPath m_dp_avg_slopes
Definition: computationGpu.hpp:193
rtctk::exampleDataTask::ComputationGpu::m_dp_stats_last_id
DataPointPath m_dp_stats_last_id
Definition: computationGpu.hpp:199
rtctk::exampleDataTask::ComputationGpu::m_dp_stats_iteration
DataPointPath m_dp_stats_iteration
Definition: computationGpu.hpp:197
rtctk::exampleDataTask::ComputationGpu::m_dp_modes
DataPointPath m_dp_modes
Definition: computationGpu.hpp:187
rtctk::exampleDataTask::ComputationGpu::m_s2m_matrix
MatrixBuffer< float > m_s2m_matrix
Definition: computationGpu.hpp:216
rtctk::exampleDataTask::ComputationGpu::m_dp_avg_modes
DataPointPath m_dp_avg_modes
Definition: computationGpu.hpp:194
rtctk::exampleDataTask::ComputationGpu::m_callback_counter
std::atomic< unsigned int > m_callback_counter
Definition: computationGpu.hpp:203
rtctk::exampleDataTask::ComputationGpu::m_sample_id
unsigned int m_sample_id
Definition: computationGpu.hpp:201
rtctk::exampleDataTask::ComputationGpu::Compute
void Compute()
Definition: computationGpu.hpp:140
rtctk::componentFramework
Definition: rtcComponent.hpp:17
oldbApiIf.hpp
Header file for OldbApiIf, which defines the API for OldbAdapters.
matrixBuffer.hpp
Declaration of the MatrixBuffer template class used in APIs.
rtctk::exampleDataTask::ComputationGpu::StaticLoad
void StaticLoad()
Definition: computationGpu.hpp:68
rtctk::exampleDataTask::ComputationGpu::m_n_iterations
int m_n_iterations
Definition: computationGpu.hpp:210
rtctk::exampleDataTask::ComputationGpu::isComputing
bool isComputing()
Definition: computationGpu.hpp:168
rtctk::componentFramework::GetLogger
log4cplus::Logger & GetLogger(const std::string &name="")
rtctk::componentFramework::OldbApiIf
Definition: oldbApiIf.hpp:18
rtctk::exampleDataTask::ComputationGpu::m_computation_running
std::atomic< bool > m_computation_running
Definition: computationGpu.hpp:204
rtctk::exampleDataTask
Definition: businessLogic.hpp:22
rtctk::exampleDataTask::ComputationGpu::m_name
std::string m_name
Definition: computationGpu.hpp:183
rtctk::exampleDataTask::ComputationGpu::m_rtr
rtctk::componentFramework::RuntimeRepoApiIf & m_rtr
Definition: computationGpu.hpp:181
rtctk::exampleDataTask::ComputationGpu::m_gpu_comp
std::unique_ptr< exampleGpuLib > m_gpu_comp
Definition: computationGpu.hpp:206
rtctk::exampleDataTask::ComputationGpu::OnDataAvailable
void OnDataAvailable(TopicType const &sample)
Definition: computationGpu.hpp:126
rtctk::componentFramework::RuntimeRepoApiIf
Definition: runtimeRepoApiIf.hpp:59
rtctk::exampleDataTask::ComputationGpu::DynamicLoad
void DynamicLoad()
Definition: computationGpu.hpp:101
rtctk::exampleDataTask::ComputationGpu::m_dp_s2m
DataPointPath m_dp_s2m
Definition: computationGpu.hpp:190
rtctk::exampleDataTask::ComputationGpu::m_buffer_matrix
MatrixBuffer< float > m_buffer_matrix
Definition: computationGpu.hpp:215
rtctk::exampleDataTask::ComputationGpu::m_dp_iterations
DataPointPath m_dp_iterations
Definition: computationGpu.hpp:188
rtctk::exampleDataTask::ComputationGpu::m_iteration
unsigned int m_iteration
Definition: computationGpu.hpp:202
rtctk::exampleDataTask::ComputationGpu::m_n_slopes
int m_n_slopes
Definition: computationGpu.hpp:208
rtctk::exampleDataTask::ComputationGpu::m_oldb
rtctk::componentFramework::OldbApiIf & m_oldb
Definition: computationGpu.hpp:182
exampleGpuLib.hpp
rtctk::exampleDataTask::ComputationGpu::m_dp_stats_time
DataPointPath m_dp_stats_time
Definition: computationGpu.hpp:198
rtctk::exampleDataTask::ComputationGpu::~ComputationGpu
~ComputationGpu()
Definition: computationGpu.hpp:63
rtctk::exampleDataTask::ComputationGpu::m_gpu
int m_gpu
Definition: computationGpu.hpp:211
rtctk::exampleDataTask::ComputationGpu::m_avg_slopes
std::vector< float > m_avg_slopes
Definition: computationGpu.hpp:213
rtctk::exampleDataTask::ComputationGpu::m_n_modes
int m_n_modes
Definition: computationGpu.hpp:209
rtctk::exampleDataTask::ComputationGpu::m_dp_slopes
DataPointPath m_dp_slopes
Definition: computationGpu.hpp:186
runtimeRepoApiIf.hpp
Header file for RuntimeRepoApiIf, which defines the API for RuntimeRepoAdapters.
rtctk::exampleDataTask::ComputationGpu::ResetComputation
void ResetComputation()
Definition: computationGpu.hpp:171
logger.hpp
Logging Support Library based on log4cplus.
rtctk::exampleDataTask::ComputationGpu::ThreadInit
void ThreadInit()
Definition: computationGpu.hpp:120
mudpi::int32_t
int int32_t
Definition: mudpi.h:17
rtctk::componentFramework::DataPointPath
Definition: dataPointPath.hpp:30
rtctk::exampleDataTask::ComputationGpu::ComputationGpu
ComputationGpu(rtctk::componentFramework::RuntimeRepoApiIf &rtr, rtctk::componentFramework::OldbApiIf &oldb, std::string const &name)
Definition: computationGpu.hpp:33
rtctk::exampleDataTask::ComputationGpu
Definition: computationGpu.hpp:31
rtctk::exampleDataTask::ComputationGpu::m_dp_gpu
DataPointPath m_dp_gpu
Definition: computationGpu.hpp:189
rtctk::componentFramework::MatrixBuffer
Definition: matrixBuffer.hpp:19
rtctk::exampleDataTask::ComputationGpu::Reset
void Reset()
Definition: computationGpu.hpp:134