File rajalib.hxx#
Defines
-
RAJALIB_H#
RAJA library utilities and wrappers
Defines:
RajaForAll A class which handles Region indices, and wraps RAJA::forall
BOUT_FOR_RAJA A macro which uses RajaForAll when BOUT_HAS_RAJA Falls back to BOUT_FOR when RAJA not enabled
Notes:
DISABLE_RAJA can be defined to 1 before including this header, to locally disable RAJA for testing.
-
SHADOW_ARG(var)#
Create a variable which shadows another (has the same name)
-
CAPTURE(...)#
Transform a list of variables into a list of var=var assignments Useful for capturing class members in lambda function arguments.
-
BOUT_FOR_RAJA(index, region, ...)#
Iterate an index over a region
If BOUT_HAS_RAJA is true and DISABLE_RAJA is false, then this macro uses RAJA (via RajaForAll) to perform the iteration.
Usage:
BOUT_FOR_RAJA(i, f.region(“RGN_NOBNDRY”)) { /* … */ }; //<- Note semicolon!
Note: Needs to be closed with
};
because it’s a lambda functionExtra arguments can be passed after the region, and will be added to the lambda capture. The intended use for this is to capture class member variables, which can’t be used directly in a RAJA CUDA loop.
Usage:
BOUT_FOR_RAJA(i, region, CAPTURE(var1, var2)) { /* … */ };
which will have a lambda capture [=, var1=var1, var2=var2] to create variables which shadow the class members.
-
struct RajaForAll#
- #include <rajalib.hxx>
Wrapper around RAJA::forall Enables computations to be done on CPU or GPU (CUDA).
Must be constructed with a
Region
. When passed a lambda function via the<<
operator, the lambda function will be called with theRegion
indices (index.ind).Usage:
RajaForAll(f.getRegion(“RGN_NOBNDRY”)) << [=](int id) { /* … */ };
where
f
is a FieldFor multiple loops, the
RajaForAll
object can be created once:RajaForAll raja_nobndry(f.getRegion(“RGN_NOBNDRY”));
and then passed lambda functions multiple times:
raja_nobndry << [=](int id) { /* … */ };
Public Functions
-
template<typename IndType>
inline RajaForAll(const Region<IndType> ®ion)# Construct by specifying a Region to iterate over. Converts the range into a form which can be used in a RAJA loop.
- Template Parameters:
IndType – Ind2D or Ind3D. The lambda function will be called with 1D (flattened) indices of this type.
- Parameters:
region – The region to iterate over
-
template<typename F>
inline const RajaForAll &operator<<(F f) const# Pass a lambda function to RAJA::forall Iterates over the range passed to the constructor
Returns a reference to
this
, so that<<
can be chained.- Template Parameters:
F – The function type. Expected to take an
int
input e.g. Lambda(int) -> void- Parameters:
f – Lambda function to call each iteration
-
template<typename IndType>