VisionCpp  0.0.1
eval_expr_stn_filt.hpp
Go to the documentation of this file.
1 // This file is part of VisionCpp, a lightweight C++ template library
2 // for computer vision and image processing.
3 //
4 // Copyright (C) 2016 Codeplay Software Limited. All Rights Reserved.
5 //
6 // Contact: visioncpp@codeplay.com
7 //
8 // Licensed under the Apache License, Version 2.0 (the "License");
9 // you may not use this file except in compliance with the License.
10 // You may obtain a copy of the License at
11 //
12 // http://www.apache.org/licenses/LICENSE-2.0
13 //
14 // Unless required by applicable law or agreed to in writing, software
15 // distributed under the License is distributed on an "AS IS" BASIS,
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 // See the License for the specific language governing permissions and
18 // limitations under the License.
19 
20 /// \file eval_expr_stn_filt.hpp
21 /// \brief This file contains the specialisation of the EvalExpr
22 /// for StnFilt( stencil node with filter ).
23 
24 #ifndef VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_STN_FILT_HPP_
25 #define VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_STN_FILT_HPP_
26 
27 namespace visioncpp {
28 namespace internal {
29 /// \brief Partial specialisation of the EvalExpr when the expression is
30 /// an StnFilt(stencil with filter operation) expression.
31 template <typename C_OP, size_t Halo_T, size_t Halo_L, size_t Halo_B,
32  size_t Halo_R, typename LHS, typename RHS, size_t Cols, size_t Rows,
33  size_t LfType, size_t LVL, typename Loc, typename... Params>
34 struct EvalExpr<StnFilt<C_OP, Halo_T, Halo_L, Halo_B, Halo_R, LHS, RHS, Cols,
35  Rows, LfType, LVL>,
36  Loc, Params...> {
37  /// \brief evaluate function when the internal::ops_category is NeighbourOP.
38  template <bool IsRoot, size_t Halo_Top, size_t Halo_Left, size_t Halo_Butt,
39  size_t Halo_Right, size_t Offset, size_t Index, size_t LC,
40  size_t LR>
41  static auto eval_neighbour(Loc &cOffset,
43  -> decltype(
45  t)) {
46  constexpr size_t OutOffset = OutputLocation<IsRoot, Offset + Index - 1>::ID;
47  constexpr bool isLocal =
48  Trait<typename tools::RemoveAll<decltype(
49  tools::tuple::get<OutOffset>(t))>::Type>::scope == scope::Local;
50  // lhs expression shared mem
51  static constexpr size_t RHSCount =
53  auto lhs_acc =
54  EvalExpr<LHS, Loc, Params...>::template eval_neighbour<
55  false, Halo_Top + Halo_T, Halo_Left + Halo_L, Halo_Butt + Halo_B,
56  Halo_Right + Halo_R, Offset, Index - 1 - RHSCount,
57  LC + Halo_L + Halo_R, LR + Halo_T + Halo_B>(cOffset, t)
58  .get_pointer();
59  // rhs expression shared mem
60  auto rhs_acc = EvalExpr<RHS, Loc, Params...>::template eval_neighbour<
61  false, Halo_Top, Halo_Left, Halo_Butt, Halo_Right,
62  Offset, Index - 1, LC, LR>(cOffset, t)
63  .get_pointer();
64 
66  lhs_acc, LC + Halo_L + Halo_R, LR + Halo_T + Halo_B);
67  // filter for StnFilt
69  rhs_acc, RHS::Type::Cols, RHS::Type::Rows);
70  for (int i = 0; i < LC; i += cOffset.cLRng) {
71  if (get_compare<isLocal, LC, Cols>(cOffset.l_c, i, cOffset.g_c)) {
72  for (int j = 0; j < LR; j += cOffset.rLRng) {
73  if (get_compare<isLocal, LR, Rows>(cOffset.l_r, j, cOffset.g_r)) {
74  neighbour.set_offset(cOffset.l_c + Halo_L + i,
75  cOffset.l_r + Halo_T + j);
76  *(tools::tuple::get<OutOffset>(t).get_pointer() +
77  calculate_index(id_val<isLocal>(cOffset.l_c, cOffset.g_c) + i,
78  id_val<isLocal>(cOffset.l_r, cOffset.g_r) + j,
79  id_val<isLocal>(LC, Cols),
80  id_val<isLocal>(LR, Rows))) =
81  tools::convert<typename MemoryTrait<
82  LfType, decltype(tools::tuple::get<OutOffset>(t))>::Type>(
83  typename C_OP::OP()(neighbour, filter));
84  }
85  }
86  }
87  }
88  // here you need to put a local barrier
89  cOffset.barrier();
90 
91  // return the valid neighbour area for your parent
92  return tools::tuple::get<OutOffset>(t);
93  }
94 };
95 } // namespace internal
96 } // namespace visioncpp
97 #endif // VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_STN_FILT_HPP_
EnableIf< k==0, typename ElemTypeHolder< 0, Tuple< Ts... > >::type & >::type get(Tuple< Ts... > &t)
get
Definition: tuple.hpp:99
T1 convert(T2 x)
function convert
Definition: convert.hpp:558
static size_t calculate_index(size_t c, size_t r, size_t cols, size_t rows)
function calculate_index
static constexpr ScopeType Local
VisionCpp namespace.
Definition: sycl/device.hpp:24
ConstNeighbour is used to provide global access to the constant memory.
static auto eval_neighbour(Loc &cOffset, const tools::tuple::Tuple< Params... > &t) -> decltype(tools::tuple::get< OutputLocation< IsRoot, Offset+Index - 1 >::ID >(t))
evaluate function when the internal::ops_category is NeighbourOP.
eval_global_neighbour function:
Definition: evaluator.hpp:195
is used to count the total number of local memory for the subxpression.
LocalNeighbour is used to provide local access for each element of the local memory based on the Coor...
This class is used to determine the ElementType of accessor template parameters.
This is used to find whether a node should use a global memory output or a local memory output is cre...
Definition: evaluator.hpp:265
The definition is in StnFilt file.
This struct is used to trait the value type inside the accessor.
Definition: evaluator.hpp:89
These methods are used to remove all the & const and * from a type.
The tuple is a fixed-size collection of heterogeneous values.
Definition: tuple.hpp:48