Skip to content

Commit e3afd46

Browse files
committed
Add template helper functions for SoA macros
Use template functions instead of macro `SWITCH_ON_TYPE`s
1 parent d62953d commit e3afd46

File tree

2 files changed

+318
-115
lines changed

2 files changed

+318
-115
lines changed

DataFormats/SoATemplate/interface/SoACommon.h

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

816+
namespace cms::soa {
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 AccumulateSoAElements;
862+
863+
template <typename T>
864+
struct AccumulateSoAElements<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 AccumulateSoAElements<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 AccumulateSoAElements<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+
cms::soa::byte_size_type computePitch(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
888+
cms::soa::byte_size_type alignment,
889+
cms::soa::size_type elements) {
890+
return cms::soa::alignSize(sizeof(T), alignment);
891+
}
892+
893+
template <typename T>
894+
cms::soa::byte_size_type computePitch(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
895+
cms::soa::byte_size_type alignment,
896+
cms::soa::size_type elements) {
897+
return cms::soa::alignSize(elements * sizeof(T), alignment);
898+
}
899+
900+
template <typename T>
901+
cms::soa::byte_size_type computePitch(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
902+
cms::soa::byte_size_type alignment,
903+
cms::soa::size_type elements) {
904+
return cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
905+
T::ColsAtCompileTime;
906+
}
907+
908+
// Helper type trait for obtaining a span type for a column
909+
template <typename ColumnType>
910+
struct getSpanType;
911+
912+
template <typename T>
913+
struct getSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
914+
using type = std::span<T, 1>;
915+
};
916+
917+
template <typename T>
918+
struct getSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
919+
using type = std::span<T>;
920+
};
921+
922+
template <typename T>
923+
struct getSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
924+
using type = std::span<typename T::Scalar>;
925+
};
926+
927+
template <typename T>
928+
struct getSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
929+
using type = std::span<T, 1>;
930+
};
931+
932+
template <typename T>
933+
struct getSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
934+
using type = std::span<T>;
935+
};
936+
937+
template <typename T>
938+
struct getSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
939+
using type = std::span<typename T::Scalar>;
940+
};
941+
942+
// Helper type trait for obtaining a const-span type for a column
943+
template <typename ColumnType>
944+
struct getConstSpanType;
945+
946+
template <typename T>
947+
struct getConstSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
948+
using type = std::span<std::add_const_t<T>, 1>;
949+
};
950+
951+
template <typename T>
952+
struct getConstSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>> {
953+
using type = std::span<std::add_const_t<T>>;
954+
};
955+
956+
template <typename T>
957+
struct getConstSpanType<cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
958+
using type = std::span<std::add_const_t<typename T::Scalar>>;
959+
};
960+
961+
template <typename T>
962+
struct getConstSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>> {
963+
using type = std::span<std::add_const_t<T>, 1>;
964+
};
965+
966+
template <typename T>
967+
struct getConstSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>> {
968+
using type = std::span<std::add_const_t<T>>;
969+
};
970+
971+
template <typename T>
972+
struct getConstSpanType<cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>> {
973+
using type = std::span<std::add_const_t<typename T::Scalar>>;
974+
};
975+
976+
// Helper functions for constructing a span from a column
977+
template <typename T>
978+
auto assignSpanToColumn(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
979+
cms::soa::size_type,
980+
cms::soa::byte_size_type alignment) {
981+
return std::span(column.addr_, 1);
982+
}
983+
984+
template <typename T>
985+
auto assignSpanToColumn(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& column,
986+
cms::soa::size_type elements,
987+
cms::soa::byte_size_type alignment) {
988+
return std::span(column.addr_, elements);
989+
}
990+
991+
template <typename T>
992+
auto assignSpanToColumn(const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
993+
cms::soa::size_type elements,
994+
cms::soa::byte_size_type alignment) {
995+
return std::span(column.addr_,
996+
cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
997+
T::ColsAtCompileTime / sizeof(typename T::Scalar));
998+
}
999+
1000+
template <typename T>
1001+
auto assignSpanToColumn(const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::scalar, T>& column,
1002+
cms::soa::size_type elements,
1003+
cms::soa::byte_size_type alignment) {
1004+
return std::span(column.addr_, 1);
1005+
}
1006+
1007+
template <typename T>
1008+
auto assignSpanToColumn(const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::column, T>& column,
1009+
cms::soa::size_type elements,
1010+
cms::soa::byte_size_type alignment) {
1011+
return std::span(column.addr_, elements);
1012+
}
1013+
1014+
template <typename T>
1015+
auto assignSpanToColumn(const cms::soa::SoAConstParametersImpl<cms::soa::SoAColumnType::eigen, T>& column,
1016+
cms::soa::size_type elements,
1017+
cms::soa::byte_size_type alignment) {
1018+
return std::span(column.addr_,
1019+
cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
1020+
T::ColsAtCompileTime / sizeof(typename T::Scalar));
1021+
}
1022+
1023+
// TODO: This function can be used when the layout will contain ColumnTypes as members
1024+
// Helper functions for memcpy from file column
1025+
// template <typename T>
1026+
// void memcpyColumnFromFile(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& destColumn,
1027+
// const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& originColumn) {
1028+
// memcpy(destColumn.addr_, originColumn.addr_, sizeof(T));
1029+
// }
1030+
1031+
// template <typename T>
1032+
// void memcpyColumnFromFile(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& destColumn,
1033+
// const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& originColumn) {
1034+
// memcpy(destColumn.addr_, originColumn.addr_, originColumn.elements_ * sizeof(T));
1035+
// }
1036+
1037+
// template <typename T>
1038+
// void memcpyColumnFromFile(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& destColumn,
1039+
// const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& originColumn) {
1040+
// memcpy(destColumn.addr_,
1041+
// originColumn.addr_,
1042+
// sizeof(T::Scalar) * destColumn.ElementsWithPadding);
1043+
// }
1044+
1045+
// TODO: This function can be used when the layout will contain ColumnTypes as members
1046+
// // Helper functions for memcpy from view column
1047+
// template <typename T>
1048+
// void memcpyColumnFromView(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& destColumn,
1049+
// const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>& originColumn) {
1050+
// memcpy(destColumn.addr_, originColumn.addr_, sizeof(T));
1051+
// }
1052+
1053+
// template <typename T>
1054+
// void memcpyColumnFromView(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& destColumn,
1055+
// const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>& originColumn) {
1056+
// memcpy(destColumn.addr_, originColumn.addr_, originColumn.elements_ * sizeof(T));
1057+
// }
1058+
1059+
// template <typename T>
1060+
// void memcpyColumnFromView(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& destColumn,
1061+
// const cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>& originColumn) {
1062+
// for (auto i = 0u; i < T::RowsAtCompileTime * T::ColsAtCompileTime; ++i) {
1063+
// memcpy(destColumn.addr_ + i * destColumn.stride_,
1064+
// originColumn.addr_,
1065+
// sizeof(T::Scalar) * destColumn.stride_ * T::RowsAtCompileTime * T::ColsAtCompileTime);
1066+
// }
1067+
// }
1068+
1069+
// TODO: This function can be used when the layout will contain ColumnTypes as members
1070+
// Helper functions for computing the location of columns in memory
1071+
// computeColumnPosition(BOOST_PP_CAT(typename Metadata::ParametersTypeOf_, NAME)(), BOOST_PP_CAT(NAME, _), _soa_impl_curMem, alignment, elements_);
1072+
//template <typename T>
1073+
//void computeColumnPosition(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::scalar, T>&& column,
1074+
// T*& columnAddr,
1075+
// std::byte*& currMem,
1076+
// cms::soa::byte_size_type alignment,
1077+
// cms::soa::size_type elements) {
1078+
// using ColumnType = decltype(column);
1079+
// //column = ColumnType(reinterpret_cast<T*>(currMem), elements);
1080+
// columnAddr = reinterpret_cast<T*>(currMem);
1081+
// currMem += cms::soa::alignSize(sizeof(T), alignment);
1082+
//}
1083+
1084+
//template <typename T>
1085+
//void computeColumnPosition(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::column, T>&& column,
1086+
// T*& columnAddr,
1087+
// std::byte*& currMem,
1088+
// cms::soa::byte_size_type alignment,
1089+
// cms::soa::size_type elements) {
1090+
// using ColumnType = decltype(column);
1091+
// //column = ColumnType(reinterpret_cast<T*>(currMem), elements);
1092+
// columnAddr = reinterpret_cast<T*>(currMem);
1093+
// currMem += cms::soa::alignSize(elements * sizeof(T), alignment);
1094+
//}
1095+
1096+
//template <typename T>
1097+
//void computeColumnPosition(cms::soa::SoAParametersImpl<cms::soa::SoAColumnType::eigen, T>&& column,
1098+
// typename T::Scalar*& columnAddr,
1099+
// std::byte*& currMem,
1100+
// cms::soa::byte_size_type alignment,
1101+
// cms::soa::size_type elements) {
1102+
// using ColumnType = decltype(column);
1103+
// //column = ColumnType(reinterpret_cast<T::Scalar*>(currMem),
1104+
// columnAddr = reinterpret_cast<T::Scalar*>(currMem);
1105+
// currMem += cms::soa::alignSize(elements * sizeof(typename T::Scalar), alignment) * T::RowsAtCompileTime *
1106+
// T::ColsAtCompileTime;
1107+
//}
1108+
} // namespace cms::soa
1109+
8161110
#endif // DataFormats_SoATemplate_interface_SoACommon_h

0 commit comments

Comments
 (0)