WIP: Lazy stencil expressions for kernel fusion#3401
Conversation
Return BinaryExpr types, perform derivatives in Z using CoordinateAccessor to get dz. Appear to inline in Hasegawa-Wakatani example.
|
|
||
| ddt(n) = | ||
| -bracket(phi, n, bm) + alpha * (nonzonal_phi - nonzonal_n) - kappa * DDZ(phi); | ||
| -bracket(phi, n, bm) + alpha * (nonzonal_phi - nonzonal_n) - kappa * DDZ_C2(phi); |
There was a problem hiding this comment.
warning: no header providing "bracket" is directly included [misc-include-cleaner]
-bracket(phi, n, bm) + alpha * (nonzonal_phi - nonzonal_n) - kappa * DDZ_C2(phi);
^| int nz{0}; | ||
|
|
||
| template <typename LView, typename RView> | ||
| BOUT_HOST_DEVICE BOUT_FORCEINLINE BoutReal operator()(int idx, const LView& lhs, |
There was a problem hiding this comment.
warning: no header providing "BOUT_FORCEINLINE" is directly included [misc-include-cleaner]
BOUT_HOST_DEVICE BOUT_FORCEINLINE BoutReal operator()(int idx, const LView& lhs,
^| int nz{0}; | ||
|
|
||
| template <typename LView, typename RView> | ||
| BOUT_HOST_DEVICE BOUT_FORCEINLINE BoutReal operator()(int idx, const LView& lhs, |
There was a problem hiding this comment.
warning: no header providing "BOUT_HOST_DEVICE" is directly included [misc-include-cleaner]
include/bout/stencil_expr.hxx:1:
- #ifndef BOUT_STENCIL_EXPR_HXX
+ #include "bout/build_config.hxx"
+ #ifndef BOUT_STENCIL_EXPR_HXX| int nz{0}; | ||
|
|
||
| template <typename LView, typename RView> | ||
| BOUT_HOST_DEVICE BOUT_FORCEINLINE BoutReal operator()(int idx, const LView& lhs, |
There was a problem hiding this comment.
warning: no header providing "BoutReal" is directly included [misc-include-cleaner]
include/bout/stencil_expr.hxx:1:
- #ifndef BOUT_STENCIL_EXPR_HXX
+ #include "bout/bout_types.hxx"
+ #ifndef BOUT_STENCIL_EXPR_HXX|
|
||
| template <typename LView, typename RView> | ||
| BOUT_HOST_DEVICE BOUT_FORCEINLINE BoutReal operator()(int idx, const LView& lhs, | ||
| const RView&) const { |
There was a problem hiding this comment.
warning: all parameters should be named in a function [readability-named-parameter]
| const RView&) const { | |
| const RView& /*unused*/) const { |
|
|
||
| template <typename LView, typename RView> | ||
| BOUT_HOST_DEVICE BOUT_FORCEINLINE BoutReal operator()(int idx, const LView& lhs, | ||
| const RView&) const { |
There was a problem hiding this comment.
warning: all parameters should be named in a function [readability-named-parameter]
| const RView&) const { | |
| const RView& /*unused*/) const { |
| inline bout::stencil::DDZExprC2 DDZ_C2(const Field3D& f) { | ||
| checkData(f); | ||
|
|
||
| const auto region_id = f.getMesh()->getRegionID("RGN_NOBNDRY"); |
There was a problem hiding this comment.
warning: member access into incomplete type 'Mesh' [clang-diagnostic-error]
const auto region_id = f.getMesh()->getRegionID("RGN_NOBNDRY");
^Additional context
include/bout/field_data.hxx:47: forward declaration of 'Mesh'
class Mesh;
^| f.getLocation(), | ||
| f.getDirections(), | ||
| region_id, | ||
| f.getMesh()->getRegion("RGN_NOBNDRY")}; |
There was a problem hiding this comment.
warning: member access into incomplete type 'Mesh' [clang-diagnostic-error]
f.getMesh()->getRegion("RGN_NOBNDRY")};
^Additional context
include/bout/field_data.hxx:47: forward declaration of 'Mesh'
class Mesh;
^| inline bout::stencil::DDZExprC4 DDZ_C4(const Field3D& f) { | ||
| checkData(f); | ||
|
|
||
| const auto region_id = f.getMesh()->getRegionID("RGN_NOBNDRY"); |
There was a problem hiding this comment.
warning: member access into incomplete type 'Mesh' [clang-diagnostic-error]
const auto region_id = f.getMesh()->getRegionID("RGN_NOBNDRY");
^Additional context
include/bout/field_data.hxx:47: forward declaration of 'Mesh'
class Mesh;
^| f.getLocation(), | ||
| f.getDirections(), | ||
| region_id, | ||
| f.getMesh()->getRegion("RGN_NOBNDRY")}; |
There was a problem hiding this comment.
warning: member access into incomplete type 'Mesh' [clang-diagnostic-error]
f.getMesh()->getRegion("RGN_NOBNDRY")};
^Additional context
include/bout/field_data.hxx:47: forward declaration of 'Mesh'
class Mesh;
^
Operators return BinaryExpr types that perform derivatives 'lazily'. Like the single index operators they capture a CoordinatesAccessor to provide access to metrics etc. The difference is that the user code doesn't need to create field accessors or explicitly write the loop, capture variables etc. All that is done automatically if the compiler is smart/sufficiently aggressively optimizing.
Implemented DDZ_C2 and DDZ_C4 operators for Z derivatives. These appear to inline as expected in the Hasegawa-Wakatani example.