Skip to content

Commit

Permalink
Add support for SoA view-level indexed access of Eigen columns
Browse files Browse the repository at this point in the history
Add support for SoA view-level indexed access of Eigen columns and enable the corresponding test.
  • Loading branch information
ericcano committed Nov 15, 2022
1 parent 9a94541 commit 89e4807
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 32 deletions.
52 changes: 33 additions & 19 deletions DataFormats/SoATemplate/interface/SoACommon.h
Expand Up @@ -570,47 +570,49 @@ namespace cms::soa {
/* Column accessors: templates implementing the global accesors (soa::x() and soa::x(index) */
enum class SoAAccessType : bool { mutableAccess, constAccess };

template <typename, SoAColumnType, SoAAccessType>
template <typename, SoAColumnType, SoAAccessType, byte_size_type, bool>
struct SoAColumnAccessorsImpl {};

// TODO from Eric Cano:
// - add alignment support
// - SFINAE-based const/non const variants

// Column
template <typename T>
struct SoAColumnAccessorsImpl<T, SoAColumnType::column, SoAAccessType::mutableAccess> {
//SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(T* baseAddress) : baseAddress_(baseAddress) {}
template <typename T, byte_size_type alignment, bool restrictQualify>
struct SoAColumnAccessorsImpl<T, SoAColumnType::column, SoAAccessType::mutableAccess, alignment, restrictQualify> {
SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(const SoAParametersImpl<SoAColumnType::column, T>& params)
: params_(params) {}
SOA_HOST_DEVICE SOA_INLINE T* operator()() { return params_.addr_; }
using NoParamReturnType = T*;
using ParamReturnType = T&;
SOA_HOST_DEVICE SOA_INLINE T& operator()(size_type index) { return params_.addr_[index]; }

private:
SoAParametersImpl<SoAColumnType::column, T> params_;
};

// Const column
template <typename T>
struct SoAColumnAccessorsImpl<T, SoAColumnType::column, SoAAccessType::constAccess> {
template <typename T, byte_size_type alignment, bool restrictQualify>
struct SoAColumnAccessorsImpl<T, SoAColumnType::column, SoAAccessType::constAccess, alignment, restrictQualify> {
SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(const SoAConstParametersImpl<SoAColumnType::column, T>& params)
: params_(params) {}
SOA_HOST_DEVICE SOA_INLINE const T* operator()() const { return params_.addr_; }
using NoParamReturnType = const T*;
using ParamReturnType = const T&;
SOA_HOST_DEVICE SOA_INLINE T const& operator()(size_type index) const { return params_.addr_[index]; }

private:
SoAConstParametersImpl<SoAColumnType::column, T> params_;
};

// Scalar
template <typename T>
struct SoAColumnAccessorsImpl<T, SoAColumnType::scalar, SoAAccessType::mutableAccess> {
template <typename T, byte_size_type alignment, bool restrictQualify>
struct SoAColumnAccessorsImpl<T, SoAColumnType::scalar, SoAAccessType::mutableAccess, alignment, restrictQualify> {
SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(const SoAParametersImpl<SoAColumnType::scalar, T>& params)
: params_(params) {}
SOA_HOST_DEVICE SOA_INLINE T& operator()() { return *params_.addr_; }
using NoParamReturnType = T&;
using ParamReturnType = void;
SOA_HOST_DEVICE SOA_INLINE void operator()(size_type index) const {
assert(false && "Indexed access impossible for SoA scalars.");
}
Expand All @@ -620,12 +622,13 @@ namespace cms::soa {
};

// Const scalar
template <typename T>
struct SoAColumnAccessorsImpl<T, SoAColumnType::scalar, SoAAccessType::constAccess> {
template <typename T, byte_size_type alignment, bool restrictQualify>
struct SoAColumnAccessorsImpl<T, SoAColumnType::scalar, SoAAccessType::constAccess, alignment, restrictQualify> {
SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(const SoAConstParametersImpl<SoAColumnType::scalar, T>& params)
: params_(params) {}
SOA_HOST_DEVICE SOA_INLINE T const& operator()() const { return *params_.addr_; }
using NoParamReturnType = T const&;
using ParamReturnType = void;
SOA_HOST_DEVICE SOA_INLINE void operator()(size_type index) const {
assert(false && "Indexed access impossible for SoA scalars.");
}
Expand All @@ -635,27 +638,32 @@ namespace cms::soa {
};

// Eigen-type
template <typename T>
struct SoAColumnAccessorsImpl<T, SoAColumnType::eigen, SoAAccessType::mutableAccess> {
//SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(T* baseAddress) : baseAddress_(baseAddress) {}
template <typename T, byte_size_type alignment, bool restrictQualify>
struct SoAColumnAccessorsImpl<T, SoAColumnType::eigen, SoAAccessType::mutableAccess, alignment, restrictQualify> {
SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(const SoAParametersImpl<SoAColumnType::eigen, T>& params)
: params_(params) {}
SOA_HOST_DEVICE SOA_INLINE typename T::Scalar* operator()() { return params_.addr_; }
using NoParamReturnType = typename T::Scalar*;
//SOA_HOST_DEVICE SOA_INLINE T& operator()(size_type index) { return params_.addr_[index]; }
using ParamReturnType = typename SoAValue<SoAColumnType::eigen, T, alignment, restrictQualify>::MapType;
SOA_HOST_DEVICE SOA_INLINE ParamReturnType operator()(size_type index) {
return SoAValue<SoAColumnType::eigen, T, alignment, restrictQualify>(index, params_)();
}

private:
SoAParametersImpl<SoAColumnType::eigen, T> params_;
};

// Const Eigen-type
template <typename T>
struct SoAColumnAccessorsImpl<T, SoAColumnType::eigen, SoAAccessType::constAccess> {
template <typename T, byte_size_type alignment, bool restrictQualify>
struct SoAColumnAccessorsImpl<T, SoAColumnType::eigen, SoAAccessType::constAccess, alignment, restrictQualify> {
SOA_HOST_DEVICE SOA_INLINE SoAColumnAccessorsImpl(const SoAConstParametersImpl<SoAColumnType::eigen, T>& params)
: params_(params) {}
SOA_HOST_DEVICE SOA_INLINE typename T::Scalar const* operator()() const { return params_.addr_; }
using NoParamReturnType = typename T::Scalar const*;
//SOA_HOST_DEVICE SOA_INLINE T operator()(size_type index) const { return params_.addr_[index]; }
using ParamReturnType = typename SoAValue<SoAColumnType::eigen, T, alignment, restrictQualify>::CMapType;
SOA_HOST_DEVICE SOA_INLINE ParamReturnType operator()(size_type index) const {
return SoAConstValue<SoAColumnType::eigen, T, alignment, restrictQualify>(index, params_)();
}

private:
SoAConstParametersImpl<SoAColumnType::eigen, T> params_;
Expand All @@ -667,8 +675,14 @@ namespace cms::soa {
template <auto columnType>
struct ColumnType {
template <auto accessType>
struct AccessType : public SoAColumnAccessorsImpl<T, columnType, accessType> {
using SoAColumnAccessorsImpl<T, columnType, accessType>::SoAColumnAccessorsImpl;
struct AccessType {
template <auto alignment>
struct Alignment {
template <auto restrictQualify>
struct RestrictQualifier: public SoAColumnAccessorsImpl<T, columnType, accessType, alignment, restrictQualify> {
using SoAColumnAccessorsImpl<T, columnType, accessType, alignment, restrictQualify>::SoAColumnAccessorsImpl;
};
};
};
};
};
Expand Down
50 changes: 38 additions & 12 deletions DataFormats/SoATemplate/interface/SoAView.h
Expand Up @@ -92,6 +92,16 @@ namespace cms::soa {
typename BOOST_PP_CAT(TypeOf_, LAYOUT_NAME)::Metadata::BOOST_PP_CAT(ParametersTypeOf_, LAYOUT_MEMBER); \
constexpr static cms::soa::SoAColumnType BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME) = \
BOOST_PP_CAT(TypeOf_, LAYOUT_NAME)::Metadata::BOOST_PP_CAT(ColumnTypeOf_, LAYOUT_MEMBER); \
using BOOST_PP_CAT(ConstAccessorOf_, LOCAL_NAME) = \
typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify> ; \
using BOOST_PP_CAT(MutableAccessorOf_, LOCAL_NAME) = \
typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify> ; \
SOA_HOST_DEVICE SOA_INLINE \
const auto BOOST_PP_CAT(parametersOf_, LOCAL_NAME)() const { \
return CAST(parent_.BOOST_PP_CAT(LOCAL_NAME, Parameters_)); \
Expand Down Expand Up @@ -364,18 +374,26 @@ namespace cms::soa {
SOA_HOST_DEVICE SOA_INLINE \
typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::mutableAccess>::NoParamReturnType \
cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>::NoParamReturnType \
LOCAL_NAME() { \
return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::mutableAccess>(const_cast_SoAParametersImpl( \
base_type:: BOOST_PP_CAT(LOCAL_NAME, Parameters_)))(); \
cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>(const_cast_SoAParametersImpl( \
base_type:: BOOST_PP_CAT(LOCAL_NAME, Parameters_)))(); \
} \
SOA_HOST_DEVICE SOA_INLINE auto& LOCAL_NAME(size_type index) { \
return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
SOA_HOST_DEVICE SOA_INLINE \
typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>::ParamReturnType \
LOCAL_NAME(size_type index) { \
return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::mutableAccess>(const_cast_SoAParametersImpl( \
base_type:: BOOST_PP_CAT(LOCAL_NAME, Parameters_)))(index); \
cms::soa::SoAAccessType::mutableAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>(const_cast_SoAParametersImpl( \
base_type:: BOOST_PP_CAT(LOCAL_NAME, Parameters_)))(index); \
}
// clang-format on

Expand All @@ -391,16 +409,24 @@ namespace cms::soa {
SOA_HOST_DEVICE SOA_INLINE \
typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::constAccess>::NoParamReturnType \
cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>::NoParamReturnType \
LOCAL_NAME() const { \
return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::constAccess>(BOOST_PP_CAT(LOCAL_NAME, Parameters_))(); \
cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>(BOOST_PP_CAT(LOCAL_NAME, Parameters_))(); \
} \
SOA_HOST_DEVICE SOA_INLINE auto const& LOCAL_NAME(size_type index) const { \
return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
SOA_HOST_DEVICE SOA_INLINE \
typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>::ParamReturnType \
LOCAL_NAME(size_type index) const { \
return typename cms::soa::SoAAccessors<typename BOOST_PP_CAT(Metadata::TypeOf_, LOCAL_NAME)>:: \
template ColumnType<BOOST_PP_CAT(Metadata::ColumnTypeOf_, LOCAL_NAME)>::template AccessType< \
cms::soa::SoAAccessType::constAccess>(BOOST_PP_CAT(LOCAL_NAME, Parameters_))(index); \
cms::soa::SoAAccessType::constAccess>::template Alignment<conditionalAlignment>:: \
template RestrictQualifier<restrictQualify>(BOOST_PP_CAT(LOCAL_NAME, Parameters_))(index); \
}
// clang-format on

Expand Down
2 changes: 1 addition & 1 deletion HeterogeneousCore/AlpakaTest/plugins/TestAlpakaAnalyzer.cc
Expand Up @@ -101,7 +101,7 @@ class TestAlpakaAnalyzer : public edm::stream::EDAnalyzer<> {
assert(view.metadata().addressOf_id() == &view.id(0));
assert(view.metadata().addressOf_id() == &view[0].id());
assert(view.metadata().addressOf_m() == view.m());
//assert(view.metadata().addressOf_m() == &view.m(0).coeffRef(0,0)); // view.m(0) does not seem to be supported for Eigen columns ?
assert(view.metadata().addressOf_m() == &view.m(0).coeffRef(0,0));
assert(view.metadata().addressOf_m() == &view[0].m().coeffRef(0, 0));
assert(view.metadata().addressOf_r() == &view.r());
//assert(view.metadata().addressOf_r() == &view.r(0)); // cannot access a scalar with an index
Expand Down

0 comments on commit 89e4807

Please sign in to comment.