VisionCpp  0.0.1
eval_expr_stn_no_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_no_filt.hpp
21 /// \brief This file contains the specialisation of the EvalExpr
22 /// for StnFilt( stencil node without filter).
23 
24 #ifndef VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_STN_NO_FILT_HPP_
25 #define VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_STN_NO_FILT_HPP_
26 
27 namespace visioncpp {
28 namespace internal {
29 /// \brief Partial specialisation of the EvalExpr when the expression is
30 /// an StnNoFilt(stencil without 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 RHS, size_t Cols, size_t Rows, size_t LfType,
33  size_t LVL, typename Loc, typename... Params>
34 struct EvalExpr<StnNoFilt<C_OP, Halo_T, Halo_L, Halo_B, Halo_R, RHS, Cols, Rows,
35  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  auto nested_acc =
52  EvalExpr<RHS, Loc, Params...>::template eval_neighbour<
53  false, Halo_Top + Halo_T, Halo_Left + Halo_L, Halo_Butt + Halo_B,
54  Halo_Right + Halo_R, Offset, Index - 1, LC + Halo_L + Halo_R,
55  LR + Halo_T + Halo_B>(cOffset, t)
56  .get_pointer();
57 
59  nested_acc, LC + Halo_L + Halo_R, LR + Halo_T + Halo_B);
60  for (int i = 0; i < LC; i += cOffset.cLRng) {
61  if (get_compare<isLocal, LC, Cols>(cOffset.l_c, i, cOffset.g_c)) {
62  for (int j = 0; j < LR; j += cOffset.rLRng) {
63  if (get_compare<isLocal, LR, Rows>(cOffset.l_r, j, cOffset.g_r)) {
64  neighbour.set_offset(cOffset.l_c + Halo_L + i,
65  cOffset.l_r + Halo_T + j);
66  *(tools::tuple::get<OutOffset>(t).get_pointer() +
67  calculate_index(id_val<isLocal>(cOffset.l_c, cOffset.g_c) + i,
68  id_val<isLocal>(cOffset.l_r, cOffset.g_r) + j,
69  id_val<isLocal>(LC, Cols),
70  id_val<isLocal>(LR, Rows))) =
71  tools::convert<typename MemoryTrait<
72  LfType, decltype(tools::tuple::get<OutOffset>(t))>::Type>(
73  typename C_OP::OP()(neighbour));
74  }
75  }
76  }
77  }
78  // here you need to put a local barrier
79  cOffset.barrier();
80  // return the valid neighbour area for your parent
81  return tools::tuple::get<OutOffset>(t);
82  }
83  // eval Global -no global
84 };
85 } // namespace internal
86 } // namespace visioncpp
87 #endif // VISIONCPP_INCLUDE_FRAMEWORK_EVALUATOR_EVAL_EXPRESSION_EVAL_EXPR_STN_NO_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
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
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 StnNoFilt 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