CMS 3D CMS Logo

eigenSoA.h
Go to the documentation of this file.
1 #ifndef HeterogeneousCore_CUDAUtilities_interface_eigenSoA_h
2 #define HeterogeneousCore_CUDAUtilities_interface_eigenSoA_h
3 
4 #include <algorithm>
5 #include <cmath>
6 #include <cstdint>
7 
8 #include <Eigen/Core>
9 
11 
12 namespace eigenSoA {
13 
14  constexpr bool isPowerOf2(int32_t v) { return v && !(v & (v - 1)); }
15 
16  template <typename T, int S>
17  class alignas(128) ScalarSoA {
18  public:
19  using Scalar = T;
20 
21  __host__ __device__ constexpr Scalar& operator()(int32_t i) { return data_[i]; }
22  __device__ constexpr const Scalar operator()(int32_t i) const { return __ldg(data_ + i); }
23  __host__ __device__ constexpr Scalar& operator[](int32_t i) { return data_[i]; }
24  __device__ constexpr const Scalar operator[](int32_t i) const { return __ldg(data_ + i); }
25 
26  __host__ __device__ constexpr Scalar* data() { return data_; }
27  __host__ __device__ constexpr Scalar const* data() const { return data_; }
28 
29  private:
31  static_assert(isPowerOf2(S), "SoA stride not a power of 2");
32  static_assert(sizeof(data_) % 128 == 0, "SoA size not a multiple of 128");
33  };
34 
35  template <typename M, int S>
36  class alignas(128) MatrixSoA {
37  public:
38  using Scalar = typename M::Scalar;
39  using Map = Eigen::Map<M, 0, Eigen::Stride<M::RowsAtCompileTime * S, S> >;
40  using CMap = Eigen::Map<const M, 0, Eigen::Stride<M::RowsAtCompileTime * S, S> >;
41 
42  __host__ __device__ constexpr Map operator()(int32_t i) { return Map(data_ + i); }
43  __host__ __device__ constexpr CMap operator()(int32_t i) const { return CMap(data_ + i); }
44  __host__ __device__ constexpr Map operator[](int32_t i) { return Map(data_ + i); }
45  __host__ __device__ constexpr CMap operator[](int32_t i) const { return CMap(data_ + i); }
46 
47  private:
48  Scalar data_[S * M::RowsAtCompileTime * M::ColsAtCompileTime];
49  static_assert(isPowerOf2(S), "SoA stride not a power of 2");
50  static_assert(sizeof(data_) % 128 == 0, "SoA size not a multiple of 128");
51  };
52 
53 } // namespace eigenSoA
54 
55 #endif // HeterogeneousCore_CUDAUtilities_interface_eigenSoA_h
eigenSoA::MatrixSoA::Map
Eigen::Map< M, 0, Eigen::Stride< M::RowsAtCompileTime *S, S > > Map
Definition: eigenSoA.h:39
mps_fire.i
i
Definition: mps_fire.py:355
eigenSoA::isPowerOf2
constexpr bool isPowerOf2(int32_t v)
Definition: eigenSoA.h:14
eigenSoA::ScalarSoA::data
constexpr Scalar * data()
Definition: eigenSoA.h:26
eigenSoA::ScalarSoA
Definition: eigenSoA.h:17
__device__
#define __device__
Definition: cudaCompat.h:85
findQualityFiles.v
v
Definition: findQualityFiles.py:179
align::Scalar
double Scalar
Definition: Definitions.h:25
eigenSoA::MatrixSoA::CMap
Eigen::Map< const M, 0, Eigen::Stride< M::RowsAtCompileTime *S, S > > CMap
Definition: eigenSoA.h:40
eigenSoA::MatrixSoA::operator()
constexpr CMap operator()(int32_t i) const
Definition: eigenSoA.h:43
eigenSoA::ScalarSoA::operator()
constexpr Scalar & operator()(int32_t i)
Definition: eigenSoA.h:21
eigenSoA::ScalarSoA::data_
Scalar data_[S]
Definition: eigenSoA.h:30
eigenSoA::MatrixSoA::operator()
constexpr Map operator()(int32_t i)
Definition: eigenSoA.h:42
eigenSoA::ScalarSoA::data
constexpr Scalar const * data() const
Definition: eigenSoA.h:27
S
double S(const TLorentzVector &, const TLorentzVector &)
Definition: Particle.cc:97
eigenSoA::MatrixSoA::operator[]
constexpr Map operator[](int32_t i)
Definition: eigenSoA.h:44
__host__
#define __host__
Definition: cudaCompat.h:84
eigenSoA::ScalarSoA::operator[]
constexpr const Scalar operator[](int32_t i) const
Definition: eigenSoA.h:24
eigenSoA::ScalarSoA::operator[]
constexpr Scalar & operator[](int32_t i)
Definition: eigenSoA.h:23
eigenSoA::ScalarSoA::operator()
constexpr const Scalar operator()(int32_t i) const
Definition: eigenSoA.h:22
eigenSoA::MatrixSoA
Definition: eigenSoA.h:36
eigenSoA::MatrixSoA::operator[]
constexpr CMap operator[](int32_t i) const
Definition: eigenSoA.h:45
eigenSoA::MatrixSoA::data_
Scalar data_[S *M::RowsAtCompileTime *M::ColsAtCompileTime]
Definition: eigenSoA.h:48
T
long double T
Definition: Basic3DVectorLD.h:48
eigenSoA::ScalarSoA::Scalar
T Scalar
Definition: eigenSoA.h:19
S
Definition: CSCDBL1TPParametersExtended.h:16
cudaCompat.h
eigenSoA
Definition: eigenSoA.h:12
cms::cudacompat::__ldg
T __ldg(T const *x)
Definition: cudaCompat.h:70
eigenSoA::MatrixSoA::Scalar
typename M::Scalar Scalar
Definition: eigenSoA.h:38