Skip to content

Commit f2a060b

Browse files
authored
Merge pull request #48607 from sbaldu/feature_SoA_template_meta
Implement template helper functions to reduce macro depencencies in SoA backend
2 parents 20dec10 + 3e41c72 commit f2a060b

File tree

2 files changed

+241
-113
lines changed

2 files changed

+241
-113
lines changed

DataFormats/SoATemplate/interface/SoACommon.h

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,4 +813,222 @@ SOA_HOST_ONLY std::ostream& operator<<(std::ostream& os, const SOA& soa) {
813813
return os;
814814
}
815815

816+
namespace cms::soa::detail {
817+
// Helper function for streaming column
818+
template <typename T>
819+
void printColumn(std::ostream& soa_impl_os,
820+
const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
821+
std::string_view name,
822+
cms::soa::byte_size_type& soa_impl_offset,
823+
cms::soa::size_type,
824+
cms::soa::byte_size_type alignment) {
825+
soa_impl_os << " Scalar " << name << " at offset " << soa_impl_offset << " has size " << sizeof(T)
826+
<< " and padding " << ((sizeof(T) - 1) / alignment + 1) * alignment - sizeof(T) << std::endl;
827+
soa_impl_offset += ((sizeof(T) - 1) / alignment + 1) * alignment;
828+
}
829+
830+
template <typename T>
831+
void printColumn(std::ostream& soa_impl_os,
832+
const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>& column,
833+
std::string_view name,
834+
cms::soa::byte_size_type& soa_impl_offset,
835+
cms::soa::size_type elements,
836+
cms::soa::byte_size_type alignment) {
837+
soa_impl_os << " Column " << name << " at offset " << soa_impl_offset << " has size " << sizeof(T) * elements
838+
<< " and padding " << cms::soa::alignSize(elements * sizeof(T), alignment) - (elements * sizeof(T))
839+
<< std::endl;
840+
soa_impl_offset += cms::soa::alignSize(elements * sizeof(T), alignment);
841+
}
842+
843+
template <typename T>
844+
void printColumn(std::ostream& soa_impl_os,
845+
const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
846+
std::string_view name,
847+
cms::soa::byte_size_type& soa_impl_offset,
848+
cms::soa::size_type elements,
849+
cms::soa::byte_size_type alignment) {
850+
soa_impl_os << " Eigen value " << name << " at offset " << soa_impl_offset << " has dimension "
851+
<< "(" << T::RowsAtCompileTime << " x " << T::ColsAtCompileTime << ")"
852+
<< " and per column size " << sizeof(T::Scalar) * elements << " and padding "
853+
<< cms::soa::alignSize(elements * sizeof(T::Scalar), alignment) - (elements * sizeof(T::Scalar))
854+
<< std::endl;
855+
soa_impl_offset +=
856+
cms::soa::alignSize(elements * sizeof(T::Scalar), alignment) * T::RowsAtCompileTime * T::ColsAtCompileTime;
857+
}
858+
859+
// Helper functions for accumulating column elements
860+
template <typename ColumnType>
861+
struct AccumulateColumnByteSizes;
862+
863+
template <typename T>
864+
struct AccumulateColumnByteSizes<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
865+
cms::soa::byte_size_type operator()(cms::soa::size_type, cms::soa::byte_size_type alignment) const {
866+
return cms::soa::alignSize(sizeof(T), alignment);
867+
}
868+
};
869+
870+
template <typename T>
871+
struct AccumulateColumnByteSizes<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
872+
cms::soa::byte_size_type operator()(cms::soa::size_type elements, cms::soa::byte_size_type alignment) const {
873+
return cms::soa::alignSize(elements * sizeof(T), alignment);
874+
}
875+
};
876+
877+
template <typename T>
878+
struct AccumulateColumnByteSizes<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
879+
cms::soa::byte_size_type operator()(cms::soa::size_type elements, cms::soa::byte_size_type alignment) const {
880+
return cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
881+
T::ColsAtCompileTime;
882+
}
883+
};
884+
885+
// Helper functions for computing the pitch of each column
886+
template <typename T>
887+
SOA_HOST_DEVICE constexpr cms::soa::byte_size_type computePitch(
888+
const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
889+
cms::soa::byte_size_type alignment,
890+
cms::soa::size_type elements) {
891+
return cms::soa::alignSize(sizeof(T), alignment);
892+
}
893+
894+
template <typename T>
895+
SOA_HOST_DEVICE constexpr cms::soa::byte_size_type computePitch(
896+
const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
897+
cms::soa::byte_size_type alignment,
898+
cms::soa::size_type elements) {
899+
return cms::soa::alignSize(elements * sizeof(T), alignment);
900+
}
901+
902+
template <typename T>
903+
SOA_HOST_DEVICE constexpr cms::soa::byte_size_type computePitch(
904+
const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
905+
cms::soa::byte_size_type alignment,
906+
cms::soa::size_type elements) {
907+
return cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
908+
T::ColsAtCompileTime;
909+
}
910+
911+
// Helper type trait for obtaining a span type for a column
912+
template <typename ColumnType>
913+
struct GetSpanType;
914+
915+
template <typename T>
916+
struct GetSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
917+
using type = std::span<T, 1>;
918+
};
919+
920+
template <typename T>
921+
struct GetSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
922+
using type = std::span<T>;
923+
};
924+
925+
template <typename T>
926+
struct GetSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
927+
using type = std::span<typename T::Scalar>;
928+
};
929+
930+
template <typename T>
931+
struct GetSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
932+
using type = std::span<T, 1>;
933+
};
934+
935+
template <typename T>
936+
struct GetSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
937+
using type = std::span<T>;
938+
};
939+
940+
template <typename T>
941+
struct GetSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
942+
using type = std::span<typename T::Scalar>;
943+
};
944+
945+
template <typename ColumnType>
946+
using SpanType = GetSpanType<ColumnType>::type;
947+
948+
// Helper type trait for obtaining a const-span type for a column
949+
template <typename ColumnType>
950+
struct GetConstSpanType;
951+
952+
template <typename T>
953+
struct GetConstSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
954+
using type = std::span<std::add_const_t<T>, 1>;
955+
};
956+
957+
template <typename T>
958+
struct GetConstSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
959+
using type = std::span<std::add_const_t<T>>;
960+
};
961+
962+
template <typename T>
963+
struct GetConstSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
964+
using type = std::span<std::add_const_t<typename T::Scalar>>;
965+
};
966+
967+
template <typename T>
968+
struct GetConstSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
969+
using type = std::span<std::add_const_t<T>, 1>;
970+
};
971+
972+
template <typename T>
973+
struct GetConstSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
974+
using type = std::span<std::add_const_t<T>>;
975+
};
976+
977+
template <typename T>
978+
struct GetConstSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
979+
using type = std::span<std::add_const_t<typename T::Scalar>>;
980+
};
981+
982+
template <typename ColumnType>
983+
using ConstSpanType = GetConstSpanType<ColumnType>::type;
984+
985+
// Helper functions for constructing a span from a column
986+
template <typename T>
987+
auto getSpanToColumn(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
988+
cms::soa::size_type,
989+
cms::soa::byte_size_type alignment) {
990+
return std::span(column.addr_, 1);
991+
}
992+
993+
template <typename T>
994+
auto getSpanToColumn(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
995+
cms::soa::size_type elements,
996+
cms::soa::byte_size_type alignment) {
997+
return std::span(column.addr_, elements);
998+
}
999+
1000+
template <typename T>
1001+
auto getSpanToColumn(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
1002+
cms::soa::size_type elements,
1003+
cms::soa::byte_size_type alignment) {
1004+
return std::span(column.addr_,
1005+
cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
1006+
T::ColsAtCompileTime / sizeof(typename T::Scalar));
1007+
}
1008+
1009+
template <typename T>
1010+
auto getSpanToColumn(const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
1011+
cms::soa::size_type elements,
1012+
cms::soa::byte_size_type alignment) {
1013+
return std::span(column.addr_, 1);
1014+
}
1015+
1016+
template <typename T>
1017+
auto getSpanToColumn(const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>& column,
1018+
cms::soa::size_type elements,
1019+
cms::soa::byte_size_type alignment) {
1020+
return std::span(column.addr_, elements);
1021+
}
1022+
1023+
template <typename T>
1024+
auto getSpanToColumn(const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
1025+
cms::soa::size_type elements,
1026+
cms::soa::byte_size_type alignment) {
1027+
return std::span(column.addr_,
1028+
cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
1029+
T::ColsAtCompileTime / sizeof(typename T::Scalar));
1030+
}
1031+
1032+
} // namespace cms::soa::detail
1033+
8161034
#endif // DataFormats_SoATemplate_interface_SoACommon_h

0 commit comments

Comments
 (0)