55 les_var_view = Kokkos::View<double**>(
"les_vars",
getNbVar(), token.size());
56 PNodes_view = Kokkos::View<PNodePod*>(
"PNodes device",
PNodes.size());
58 auto host_PNodes_view = Kokkos::create_mirror_view(PNodes_view);
59 for (
size_t i = 0; i <
PNodes.size(); i++)
60 host_PNodes_view(i) =
PNodes[i];
62 Kokkos::deep_copy(PNodes_view, host_PNodes_view);
64 KOKKOS_INLINE_FUNCTION
void setVar(
int i,
double val,
int threadId)
const
66 assert(i>=0 && i<
ivar);
67 les_var_view(i, threadId) = val;
69 KOKKOS_INLINE_FUNCTION
double eval(
int threadId)
const
71 return eval(PNodes_view[0], threadId);
76#pragma clang optimize off
77 KOKKOS_INLINE_FUNCTION
int acquire()
const {
return token.acquire(); }
78#pragma clang optimize on
79 KOKKOS_INLINE_FUNCTION
void release(
int threadId)
const { token.release(threadId); }
81 Kokkos::Experimental::UniqueToken<Kokkos::DefaultExecutionSpace> token;
82 Kokkos::View<double**> les_var_view;
83 Kokkos::View<PNodePod*> PNodes_view;
92 KOKKOS_INLINE_FUNCTION
double eval(
const PNodePod& node,
int threadId)
const
96 if (node.
type == 4)
return les_var_view(node.
value, threadId);
99 const int MAX_STACK = 64;
100 StackEntry stack[MAX_STACK];
104 stack[stack_ptr] = {0, 0.0, 0,
true};
106 while (stack_ptr >= 0)
108 StackEntry& current = stack[stack_ptr];
109 const PNodePod& current_node = current.is_root ? node : PNodes_view[current.node_idx];
111 switch (current_node.
type)
114 current.result = current_node.
nvalue;
119 current.result = les_var_view(current_node.
value, threadId);
124 switch (current.state)
127 if (current_node.
left != -1)
131 stack[stack_ptr] = {current_node.
left, 0.0, 0,
false};
135 current.result = 0.0;
142 double left_result = (stack_ptr < MAX_STACK-1) ? stack[stack_ptr + 1].result : 0.0;
143 if (current_node.
right != -1)
146 stack[stack_ptr].result = left_result;
148 stack[stack_ptr] = {current_node.
right, 0.0, 0,
false};
152 current.result =
const_cast<ParserView*
>(
this)->
evalOp(current_node, left_result, 0.0);
160 double right_result = stack[stack_ptr + 1].result;
161 current.result =
const_cast<ParserView*
>(
this)->
evalOp(current_node, current.result, right_result);
169 if (current.state == 0)
171 if (current_node.
value <= 0 && current_node.
left != -1)
175 stack[stack_ptr] = {current_node.
left, 0.0, 0,
false};
185 double arg = stack[stack_ptr + 1].result;
197 return stack[0].result;