Is the pacxx-kernel capturing a Dune::BlockVector?
I'm trying the pacxx profiling infrastructure on master@a052c775990b030e7ecf9244b74b2001d4d592b5. Running
-*- mode: compilation; default-directory: "/scp:agamemnon:/home/joe/Projekte/pps/pacxx-projectseminar-2019/build-cmake/src/" -*-
Compilation started at Tue Jun 11 10:07:22
PACXX_PROF_ENABLE=1 PACXX_PROF_OUT=pacxx.json PPS_CONFIG=octagon.ini ./solution01-device -output.filename octagon-device-richardson-matrixfree
-*- mode: compilation; default-directory: "/scp:agamemnon:/home/joe/Projekte/pps/pacxx-projectseminar-2019/build-cmake/src/" -*-
Compilation started at Tue Jun 11 10:07:22
PACXX_PROF_ENABLE=1 PACXX_PROF_OUT=pacxx.json PPS_CONFIG=octagon.ini ./solution01-device -output.filename octagon-device-richardson-matrixfree
[...]
I get pacxx.json, which includes timing for a kernel
void pacxx::v2::genericKernel<void PPS::GridOperator<Dune::GridView<Dune::UGGridLeafGridViewTraits<Dune::UGGrid<2> const> >, PPS::NonlinearPoissonFEM<PPS::NonlinearPoissonProblem<double> >, double>::nonlinear_jacobian_apply_imp<Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >, void PPS::CommonGridOperator<PPS::GridOperator<Dune::GridView<Dune::UGGridLeafGridViewTraits<Dune::UGGrid<2> const> >, PPS::NonlinearPoissonFEM<PPS::NonlinearPoissonProblem<double> >, double>, Dune::GridView<Dune::UGGridLeafGridViewTraits<Dune::UGGrid<2> const> >, PPS::NonlinearPoissonFEM<PPS::NonlinearPoissonProblem<double> >, double>::nonlinear_jacobian_apply<Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > >(Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > const&, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > const&, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >&) const::'lambda'(Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >)>(Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > const&, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > const&, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >&, void PPS::CommonGridOperator<PPS::GridOperator<Dune::GridView<Dune::UGGridLeafGridViewTraits<Dune::UGGrid<2> const> >, PPS::NonlinearPoissonFEM<PPS::NonlinearPoissonProblem<double> >, double>, Dune::GridView<Dune::UGGridLeafGridViewTraits<Dune::UGGrid<2> const> >, PPS::NonlinearPoissonFEM<PPS::NonlinearPoissonProblem<double> >, double>::nonlinear_jacobian_apply<Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > >(Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > const&, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > > const&, Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >&) const::'lambda'(Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >)) const::'lambda'(pacxx::v2::range&)>(Dune::BlockVector<Dune::FieldVector<double, 1>, std::allocator<Dune::FieldVector<double, 1> > >, char const**)
What worries me here is the by-value Dune::BlockVector
parameter to the pacxx::v2::genericKernel
function. If that get's transferred onto the device, we should be in trouble.
It seems that this is the same parameter that is passed to the transformation lambda that is passed to nonlinear_jacobian_apply_imp()